老胡的看法:
nohup,disown和&是Linux中用來進行作業控制的命令,它們都與作業的執行過程控制有關係。這三個傢伙主要的區別在於對作業執行的排程動作上,區別還是很明顯的。
老胡打算先說nohup的主要原因是想說造成nohup、disown和&容易混淆的原因:HUP訊號。Linux的shell在遠端登入斷開和使用者登出時,會收到系統傳送的HUP訊號,然後就會陸續關閉它的子程序。無論我們是在本機的終端上登入的shell,還是遠端登入的shell,在這個shell裡面執行的所有命令都是它的子程序。如果在shell收到HUP的時候,我們不想自己執行的指令碼或者命令被殺死,就需要用到nohup:
這樣一來,nohup後面的命令就會無視shell發來的HUP訊號繼續執行直到結束。
nohup會將緊隨其後的命令或者指令碼的標準輸出重定向到
nohup.out
通常我們使用nohup的時候,末尾都會加一個&一起使用。在上面的截圖中可以看到,nohup後面的命令依然是當前shell的子程序。nohup不會將執行命令的作業與shell斷開聯絡。
如果將一個命令後面加上&來執行,那麼這條命令會被提交到作業列表,並且能夠響應標準輸入,命令的輸出結果也能夠輸出到標準輸出流和標準錯誤流:
使用jobs命令來檢視作業列表可以看到這個任務的身影:
如果使用()將需要放置在後臺執行的命令括起來的話,jobs就查不到這條作業了。
原因是()以子shell程序執行,其父程序是系統程序init:
所以&與()配合使用,可以將命令作為init的子程序執行。
實際的應用中,比如我們在執行一條用時比較長的命令的時候,忽然臨時需要登出系統或者關閉shell,而在當時執行這個命令時沒有考慮到要提交為作業放到後臺執行。可以先用Ctrl+z來掛起當前程序,使用jobs獲得作業號,然後再使用disown來切斷這個命令與當前shell程序的聯絡,這樣就可以避免shell關閉的時候會中斷命令的執行。
總結一下,nohup,disown和&之間的區別可以用作業排程的能力來看,排序如下:
disown>&>nohup。nohup只能讓命令在執行時忽略shell傳來的HUP訊號,使命令能夠無視shell的退出繼續執行完畢;disown可以隨意排程正在執行的作業,使之與shell斷開聯絡從而避免被HUP訊號終止;&配合()進行子shell呼叫可以實現將命令作為init的子程序執行。
老胡的看法:
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 www.baidu.com & )原因是()以子shell程序執行,其父程序是系統程序init:
所以&與()配合使用,可以將命令作為init的子程序執行。
實際的應用中,比如我們在執行一條用時比較長的命令的時候,忽然臨時需要登出系統或者關閉shell,而在當時執行這個命令時沒有考慮到要提交為作業放到後臺執行。可以先用Ctrl+z來掛起當前程序,使用jobs獲得作業號,然後再使用disown來切斷這個命令與當前shell程序的聯絡,這樣就可以避免shell關閉的時候會中斷命令的執行。
總結一下,nohup,disown和&之間的區別可以用作業排程的能力來看,排序如下:
disown>&>nohup。nohup只能讓命令在執行時忽略shell傳來的HUP訊號,使命令能夠無視shell的退出繼續執行完畢;disown可以隨意排程正在執行的作業,使之與shell斷開聯絡從而避免被HUP訊號終止;&配合()進行子shell呼叫可以實現將命令作為init的子程序執行。