(2.1)終端和進程的關係

(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切換到前臺

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章