1. & 啟動的程序在終端關閉之後也會被關閉
比如作者寫了一個 java 程式 rainbow-app2-1.0.0.jar,使用以下指令啟動
# java -jar rainbow-app2-1.0.0.jar &
一個程序被啟動,并且在背景運作了。通過 ps 檢視該程序的狀态:

可以看出該程序 pid 是 10711,ppid 是 10638。也就是說,這個程序是本次的遠端 SSH 會話開啟的一個子程序。我們關掉 SSH 用戶端,然後重新登入,再次 PS 一下:
可以看到該程序随着上次 SSH 會話的關閉已經被關閉。
這不是我想要的。我期望的是,在我下班關閉 SSH 回家之後,該 Java 程序還是要能夠繼續運作,繼續工作。
2. 使用 nohup 啟動一個父程序關閉之後仍然能夠運作的背景程序
# nohup java -jar rainbow-app2-1.0.0.jar >app2.out 2>&1 &
這條指令也将在背景啟動一個新程序,并把 java 程式的所有輸出(包括所有标準輸出和錯誤輸出)都重定向到 app2.out 檔案中。這條指令執行之後,控制台輸出啟動的背景程序的 pid:
ps 檢視其狀态:
可以看出該程序 pid 是 10916,ppid 是 10829。也就是說,這個程序也是本次的遠端 SSH 會話開啟的一個子程序。我們關掉 SSH 用戶端,然後重新登入,再次 PS 一下:
可以看到該程序并沒有随着上次 SSH 會話的關閉而被關閉,它的 pid 仍舊是 10916,隻不過它的 ppid 變成了 1。一般來講 ppid 為 1 的是作為系統程序啟動的程序,這裡 java 程序的 ppid 也是 1 卻是屬于另外一種情況:父程序已被關閉,子程序仍在運作。
參考資料
- http://en.wikipedia.org/wiki/Nohup