1.&和nohup的區別
&的意思是在后台運行, 意思是說, 當你在執行 ./start.sh & 的時候, 即使你用ctrl C, 那么start.sh照樣運行(因為對SIGINT信號免疫)。 但是要注意, 如果你直接關掉shell后(斷開SSH連接), 那么,start.sh進程同樣消失。 可見, &的后台並不硬(因為對SIGHUP信號不免疫)。
nohup的意思是忽略SIGHUP信號, 所以當運行nohup ./start.sh的時候, 關閉shell(斷開SSH連接), 那么start.sh進程還是存在的(對SIGHUP信號免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl C, 那么start.sh進程也是會消失的(因為對SIGINT信號不免疫)
2.舉例分析&和nohup的實際作用和效果
sh test.sh & 將sh test.sh任務放到后台 ,即使關閉xshell退出當前session依然繼續運行,但標准輸出和標准錯誤信息會丟失
nohup sh test.sh 將sh test.sh任務放到后台,關閉標准輸入,前台不再能夠接收任何輸入(標准輸入),重定向標准輸出和標准錯誤到當前目錄下的nohup.out文件,即使關閉xshell退出當前session依然繼續運行。
nohup sh test.sh & 將sh test.sh任務放到后台,但是依然可以使用標准輸入,前台能夠接收任何輸入,重定向標准輸出和標准錯誤到當前目錄下的nohup.out文件,即使關閉xshell退出當前session依然繼續運行。
綜上所述,如果你要讓一個進程既不受Ctrl C的影響也不受關閉shell的影響,就將nohup和&聯合起來使用,例如我在編寫Jenkins部署發布SpringCloud微服務的jar包的腳本時就會用都下面的命令:
nohup java -jar $JARFILE >& $JARFIILE.log &
這樣就會使該進程以守護進程的模式一直運行在后台,並且不會關閉標准輸入,也就是你還可以去做別的事情,比如啟動其他jar包。