1. 程式人生 > 實用技巧 >linux 如何保證使程式後臺執行(nohup &)

linux 如何保證使程式後臺執行(nohup &)

起因

部署springboot專案時,為了保證他後他執行,我用瞭如下命令:

 nohup java -jar jsczams-web-ams.jar > ams.log 2>&1 &

下面記錄nohup以及&的具體含義

&

一條命令後面跟個&表示該程式讓出終端,不佔用終端,獨自後臺執行。如果用下面的命令

java -jar jsczams-web-ams.jar &

表示我的程式後臺執行,我可以用終端發出其他指令,做其他的事。

但是問題在於,如果我斷開終端(比如 ssh),而該程式屬於我這個會話的程序,也會被終斷。

由此可見,單獨使用&並不能滿足我們的需求。

nohup

當我們使用nohup命令時

nohup java -jar jsczams-web-ams

程式會繼續霸佔終端,我們做不了其他的事,但是我們可以關閉這個終端,再開一個新的終端,這樣做並不會終止這個程序。但是新開一個終端有點麻煩,所以使用了下面的做法。

nohup和&

一般來說,nohup 和 & 都是結合起來使用的。表示程式後臺執行,不佔用當前終端,而且終端關閉後,程式還能繼續執行。

>和>>

這個應該比較簡單

>表示覆蓋指定檔案,檔案已有的內容都沒有了。

>>表示在檔案的尾部追加內容。

2>&1的具體含義

這些數字是檔案描述符,0表示標準輸入,1表示標準輸出,2表示標準錯誤輸出。

2>&1表示將標準錯誤輸出與標準輸出合併起來,也就是說將控制的所有輸出重定向到指定的檔案裡。

至於為什麼是2>&1,而不是2>1,是因為2>1會被解釋為向1裡面寫東西。

總結

現在再看這條指令的含義就很明確了

nohup java -jar jsczams-web-ams.jar > ams.log 2>&1 &

nohup 和 &保證能後臺執行,>ams.log 將1的輸出重定向到ams.log檔案,2>&1表示將2的輸出重定向給1,而此時1的輸出重定向到了ams.log,所以2和1的輸出都重定向到了ams.log檔案中。

後續程式如果遇到什麼問題,可以在程式所在目錄的ams.log檔案中查到問題所在(tail命令)

如果嫌棄上面的寫法太繁瑣,也可以簡寫:

nohup java -jar  jsczams-web-ams.jar  &>ams.log &

或者

nohup java -jar  jsczams-web-ams.jar  >&ams.log &