天天看點

使用 nohup 讓程序在背景運作

1. & 啟動的程序在終端關閉之後也會被關閉

比如作者寫了一個 java 程式 rainbow-app2-1.0.0.jar,使用以下指令啟動

# java -jar rainbow-app2-1.0.0.jar &

一個程序被啟動,并且在背景運作了。通過 ps 檢視該程序的狀态:

使用 nohup 讓程式在背景運作

可以看出該程序 pid 是 10711,ppid 是 10638。也就是說,這個程序是本次的遠端 SSH 會話開啟的一個子程序。我們關掉 SSH 用戶端,然後重新登入,再次 PS 一下:

使用 nohup 讓程式在背景運作

可以看到該程序随着上次 SSH 會話的關閉已經被關閉。

這不是我想要的。我期望的是,在我下班關閉 SSH 回家之後,該 Java 程序還是要能夠繼續運作,繼續工作。

2. 使用 nohup  啟動一個父程序關閉之後仍然能夠運作的背景程序

# nohup java -jar rainbow-app2-1.0.0.jar >app2.out 2>&1 &

這條指令也将在背景啟動一個新程序,并把 java 程式的所有輸出(包括所有标準輸出和錯誤輸出)都重定向到 app2.out 檔案中。這條指令執行之後,控制台輸出啟動的背景程序的 pid:

使用 nohup 讓程式在背景運作

ps 檢視其狀态:

使用 nohup 讓程式在背景運作

可以看出該程序 pid 是 10916,ppid 是 10829。也就是說,這個程序也是本次的遠端 SSH 會話開啟的一個子程序。我們關掉 SSH 用戶端,然後重新登入,再次 PS 一下:

使用 nohup 讓程式在背景運作

可以看到該程序并沒有随着上次 SSH 會話的關閉而被關閉,它的 pid 仍舊是 10916,隻不過它的 ppid 變成了 1。一般來講 ppid 為 1 的是作為系統程序啟動的程序,這裡 java 程序的 ppid 也是 1 卻是屬于另外一種情況:父程序已被關閉,子程序仍在運作。

參考資料

  • ​​http://en.wikipedia.org/wiki/Nohup​​