首頁>Club>
11
回覆列表
  • 1 # 產品經理老胡

    老胡的看法:

    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的子程序執行。

  • 中秋節和大豐收的關聯?
  • 釋出前,如何給老闆Demo產品?