linux 如何保證使程式後臺執行(nohup &)
阿新 • • 發佈:2020-10-28
起因
部署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 &