(1.1)終端與bash進程
//ps -ef | grep bash
//pts(虛擬終端),每連接一個虛擬終端到烏班圖linux操作系統,
//就會出現 一個bash進程(shell[殼]),黑窗口,用於解釋用戶輸入的命令
//bash = shell = 命令行解釋器
//whereis bash
(1.2)終端上的開啓進程
//ps -la
//man ps
//隨着終端的退出,這個終端上運行的進程nginx也退出了;
//可執行程序nginx是bash的子進程;
//《unix環境高級編程》第九章 進程關係;
(1.3)進程關係進一步分析
//每個進程還屬於一個進程組:一個或者多個進程的集合,每個進程組有一個唯一的進程組ID,可以調用系統 函數來創建進程組、加入進程組
//“會話”(session):是一個或者多個進程組的集合
//一般,只要不進行特殊的系統函數調用,一個bash(shell)上邊運行的所有程序都屬於一個會話,而這個會話有一個session leader;
//那麼這個bash(shell)通常就是session leader; 你可以調用系統功函數創建新的session。
//ps -eo pid,ppid,sid,tty,pgrp,comm | grep -E 'bash|PID|nginx'
//a)如果我 xshell終端要斷開的話,系統就會發送SIGHUP信號(終端斷開信號),給session leader,也就是這個bash進程
//b)bash進程 收到 SIGHUP信號後,bash會把這個信號發送給session裏邊的所有進程,收到這個SIGHUP信號的進程的缺省動作就是退出;
(1.4)strace工具的使用
//linux下調試分析診斷工具:可以跟蹤程序執行時進程的系統調用以及所收到的信號;
//a)跟蹤nginx進程 : sudo strace -e trace=signal -p 1359
//kill(4294965937, SIGHUP) :發送信號SIGHUP給這個 -1359的絕對值所在的進程組;所以nginx進程就收到了SIGHUP信號
//綜合來講,這個bash先發送SIGHUP給 同一個session裏邊的所有進程;
//然後再發送SIGHUP給自己;
//int abc = 4294965937; //-1359
(1.5)終端關閉時如何讓進程不退出
//設想
//a)nginx進程攔截(忽略)SIGHUP(nginx收到這個信號並告訴操作系統,我不想死,請不要把我殺死)信號,是不是可以;
//b)nginx進程和bash進程不再同一個seeion裏;
//孤兒進程
//setsid函數不適合進程組組長調用;
//setsid命令:啓動一個進程,而且能夠使啓動的進程在一個新的session中,這樣的話,終端關閉時該進程就不會退出,試試
//setsid ./nginx
//nohup(no hang up不要掛斷),用該命令啓動的進程跟上邊忽略掉SIGHUP信號,道理相同
//該命令會把屏幕輸出重新定位到當前目錄的nohup.out
//ps -eo pid,ppid,sid,tty,pgrp,comm,cmd|grep -E 'bash|PID|nginx'
(1.6)後臺運行 &
//後臺執行,執行這個程序的同時,你的終端能夠幹其他事情;你如果不用 後臺執行,那麼你執行這個程序後
//你的終端就只能等這個程序完成後才能繼續執行其他的操作;
//fg切換到前臺