在服務器上啓動普通java進程時(非web服務器) 之後臺方式運行,命令通常是這樣,如:java
java com.company.XXX &
但偶爾會有這種狀況,前一晚啓動的進程,次日去服務器上看時發現卻沒有相關進程存在。
linux
做爲一個無神論者,固然不相信是見鬼了。 諮詢運維同事得知應該是退出SSH終端致使。web
任務在什麼狀況下會被無端幹掉呢?你退出終端的時候就會。由於Linux下任務是與操做者終端關聯的,只要你退出了終端,與其關聯的全部任務都會被幹掉。
shell
(摘自Linux就是這個範兒 P62)服務器
以下所示:app
$ java WaitForever & [1] 8951 $ jps -l 8951 WaitForever 9001 sun.tools.jps.Jps #經過ctrl+shift+w方式關閉終端 #再新開啓一個終端(ctrl+shift+t) #在新終端中 進程已經不在了 $ jps -l 9523 sun.tools.jps.Jps
但若顯式執行exit退出終端的話,能夠避免上述問題。以下所示:運維
$ java WaitForever & [1] 10603 $ jps -l 10626 sun.tools.jps.Jps 10603 WaitForever $ exit #新開啓一個終端 $ jps -l 10885 sun.tools.jps.Jps 10603 WaitForever
固然能夠用更保險的啓動進程方式,即便用nohup, 它能保證被它啓動的任務脫離與終端的關聯。以下所示:spa
$ nohup java WaitForever & [1] 11895 nohup: ignoring input and appending output to ‘nohup.out’ $ jps -l 11936 sun.tools.jps.Jps 11895 WaitForever #使用ctrl+shift+w關閉終端 #新開啓一個終端 進程還在 $ jps -l 11895 WaitForever 12574 sun.tools.jps.Jps
須要注意,命令的全部輸出都會輸出到nohup.out這個文件中。code
補充:orm
還能夠利用screen,如:
screen -dmLS processName com.company.XXX
這時至關於開啓了一個新的會話來啓動該java進程。
參考文檔:
《Linux 就是這個範兒》2.4.1 執行程序的方法,以及多任務協調機制
screen 介紹: