Linux中的nohup,disown和&有什麼區別?

職場十萬個為什麼


老胡的看法:

nohup,disown和&是Linux中用來進行作業控制的命令,它們都與作業的執行過程控制有關係。這三個傢伙主要的區別在於對作業執行的調度動作上,區別還是很明顯的。


一、先說說nohup

老胡打算先說nohup的主要原因是想說造成nohup、disown和&容易混淆的原因:HUP信號。Linux的shell在遠程登錄斷開和用戶登出時,會收到系統發送的HUP信號,然後就會陸續關閉它的子進程。無論我們是在本機的終端上登錄的shell,還是遠程登錄的shell,在這個shell裡面運行的所有命令都是它的子進程。如果在shell收到HUP的時候,我們不想自己運行的腳本或者命令被殺死,就需要用到nohup:

nohup 命令或腳本

這樣一來,nohup後面的命令就會無視shell發來的HUP信號繼續運行直到結束。

nohup會將緊隨其後的命令或者腳本的標準輸出重定向到

nohup.out

文件,一般我們使用它的時候都會將其重定向到自己定義的文件名:
nohup 命令或腳本 > filename 2>&1

通常我們使用nohup的時候,末尾都會加一個&一起使用。在上面的截圖中可以看到,nohup後面的命令依然是當前shell的子進程。nohup不會將執行命令的作業與shell斷開聯繫。


二、&都幹了些什麼

如果將一個命令後面加上&來執行,那麼這條命令會被提交到作業列表,並且能夠響應標準輸入,命令的輸出結果也能夠輸出到標準輸出流和標準錯誤流:

使用jobs命令來查看作業列表可以看到這個任務的身影:

如果使用()將需要放置在後臺執行的命令括起來的話,jobs就查不到這條作業了。

(ping &

原因是()以子shell進程運行,其父進程是系統進程init:

所以&與()配合使用,可以將命令作為init的子進程執行。


三、disown的作用

disown主要用於作業列表的控制它可以根據作業號,將指定的作業從作業列表中刪除,並將作業進程轉為init的子進程。

例如:

disown -h %1

就是將作業號為1的作業從作業列表中刪除,在shell退出的時候將其作為init的子進程繼續執行。

實際的應用中,比如我們在運行一條用時比較長的命令的時候,忽然臨時需要登出系統或者關閉shell,而在當時運行這個命令時沒有考慮到要提交為作業放到後臺運行。可以先用Ctrl+z來掛起當前進程,使用jobs獲得作業號,然後再使用disown來切斷這個命令與當前shell進程的聯繫,這樣就可以避免shell關閉的時候會中斷命令的執行。


總結一下,nohup,disown和&之間的區別可以用作業調度的能力來看,排序如下:

disown>&>nohup。nohup只能讓命令在執行時忽略shell傳來的HUP信號,使命令能夠無視shell的退出繼續執行完畢;disown可以隨意調度正在執行的作業,使之與shell斷開聯繫從而避免被HUP信號終止;&配合()進行子shell調用可以實現將命令作為init的子進程執行。


如果我的回答對你有點價值,請莫忘點贊加關注,謝謝!歡迎在評論區發表各種意見。

本文為作者原創,嚴禁轉載,違者必究。


分享到:


相關文章: