1. 程式人生 > >程序與終端--終端關閉後,後臺程序也終止

程序與終端--終端關閉後,後臺程序也終止

問題:

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等其他,有興趣可以自行搜尋檢視。

參考: