2016-02-11 177 views
0

我有一些代碼看起來像這樣後臺進程在其父進程終止時被終止?

function doTheThing{ 
    # a potentially infinite while loop... 
} 
# other stuff... 
doTheThing & 
trap "kill $!" SIGINT SIGTERM 

奇怪的是,當我CTRL-C出父進程的循環完成之前,我得到這個過程不存在的消息。此外,如果我擺脫陷阱,我不能找到一個ps -aF的過程。看起來後臺進程在其父進程終止時被殺死,但我的理解是不應該發生。我只是想確保我能夠安全地離開陷阱,並且不會在任何地方留下殭屍進程。

+1

Control-C會殺死整個進程組,而不僅僅是進程。 – Barmar

+1

殭屍進程是一個已經死亡的進程,但其父進程尚未調用「wait」。如果父母被殺,殭屍會被等待它的'init'繼承。 – Barmar

+0

所以要清楚,你是說如果我擺脫陷阱,我不會留下任何額外的流程? –

回答

2

POSIX specification說,當你輸入中斷字符(通常控制-C)的SIGINT被髮送到前臺進程組。因此,只要後臺進程與調用它的腳本在同一進程組中運行,它就會在腳本進程的同一時間接收到該信號。

Shell通常使用進程組來實現作業控制,並且默認情況下只在交互式shell中啓用,而不是在運行腳本的shell中啓用。在自己的進程組中沒有標準的方法來運行一個函數,但是您可以使用setsid在新的會話中運行它,這比分組進程的分組水平更高。然後它不會收到中斷。

儘管如此,您仍然可能想要編寫一個trap命令來殺死EXIT上的函數。

doTheThing& 
trap "kill $!" EXIT 

因爲退出腳本不會自動終止進程組的其餘部分。

+0

幸運的是,這是一個啓動長時間運行的開發服務器的腳本。據我所知,腳本結束的唯一方式是sigint sigterm等,或者服務器本身的段錯誤/致命錯誤,所以我認爲我不需要擔心 –