程序與終端--終端關閉後,後臺程序也終止
阿新 • • 發佈:2019-01-24
問題:
ssh登入伺服器,並開啟一個後臺程序,然後自己去做其他事情了。等過了一會兒,當再來檢視時,發現開啟的後臺程序莫名其妙的掛掉了。
原因:
無論程序是在後臺還是在前臺,它都與啟動它的終端例項緊密繫結。當終端關閉時,它通常向繫結到終端的所有程序(前臺、後臺程序)傳送SIGHUP訊號。 這表示程序終止,因為它們的控制終端將很快不可用。
本例中,ssh登入終端,超過一定時間沒有操作後,連線斷開,終端關閉,與終端相關的所有程序(包括前臺和後臺程序)都將終止。
驗證:
開啟一個後臺程序
程式碼如下:
terminal_process.c
#include <unistd.h>
int main()
{
while(1)
{
sleep(10);
}
return 0;
}
編譯、後臺執行
$ gcc terminal_process.c -o terminal_process
$ ./terminal_process &
檢視前後臺程序、終端
$ ps -o pid,ppid,pgrp,session,tpgid,comm,tty
PID PPID PGRP SESS TPGID COMMAND TT
15907 15906 15907 15907 16145 bash pts/1
15946 15907 15946 15907 16145 terminal_proces pts/1
16145 15907 16145 15907 16145 ps pts/1
其中,
- pgrp 程序組ID
- tpgid 控制程序組ID
- tty 控制終端號
- 15097是會話首程序,會話ID為其ID,此時會話首程序屬於後臺程序組。
- terminal_proces程序是15946,其父程序為bash(會話首程序15907)。
- 16145擁有控制終端,所以是前臺程序組。
- 15907、15946都是後臺程序組。
過一段時間,沒有操作終端,ssh登入終端自動斷開。
再檢視程序,可以看到剛才開啟的程序已經終止。
另外,本地終端強制關閉,也有類似的問題。
解決辦法:
終端開啟一個後臺程序後,例如termal_process,然後終端下輸入命令exit正常退出.
$ ./terminal_process &
$ ps -ef | grep terminal_process
lanyang 16946 16907 0 10:18 pts/1 00:00:00 ./terminal_process
$ exit
登入另一個終端檢視
$ ps -ef | grep terminal_process
lanyang 16946 1 0 10:18 ? 00:00:00 ./terminal_process
terminal_process的父程序已經變成了init程序,不會出現剛才的問題。
除了這個方法,還有nohup,disown等其他,有興趣可以自行搜尋檢視。