使用SSH遠程登陸上Linux服務器,運行一些耗時的任務時,如果因為網絡中斷,這些任務也會就此中斷,應此需要這些任務不受終端斷開而影響,首先先看下圖:
這是運行以下命令的結果 : ping localhost > /dev/null &,很明顯ping是sshd的子子進程,因此當sshd斷開連接時,ping命令必然會終止。
以下有幾種方法避免此種情況發生:
一、使用nohup:
在網絡斷開和logout時,終端會收到hup信息,因此會關閉其所有子進程,nohup正是針對此情況:
運行如下命令: nohup ping localhost > /dev/null & ,然後斷開終端,可以看到:
斷開終端之後,父進程ID變為1,即被init所接管的孤兒進程,因為其原來的父進程30999已經退出。
二、使用setuid
setuid ping localhost > /dev/null &
可見setsid直接將其父進程ID設置1
三、使用()加上&元字符
運行如下命令:( ping localhost > /dev/null &)
同setsid一樣結果,過程是如下的
├─sshd─┬─sshd─┬─bash───bash───ping
因為&是元字符,因此會新開一個bash來解釋執行ping,然後()使ping成為子shell,右邊的bash在解釋完畢後會退出,但是ping子進程還在,因此使其成為孤兒進程,被init接管。
四、使用screen
可能需要手動安裝 yum install -y screen
常用命令:
screen:啟用一個screen會話
鍵入C-a c ,按下Ctrl鍵+a組合鍵,然後再按下c鍵:會在當前screen會話中新建一個窗口/BASH
exit:如果是該screen會話的唯一窗口,該screen會話將會退出,否則screen會切換到前一個窗口。
screen -d pid:detach分離screen會話
screen -r pid:reattach重新附著會話,比如你可以在一個會話中前台運行ls -R /,然後退出screen會話,再reattach該會話,可以發現仍在繼續執行或者已經執行完畢。
五、使用disown
用法如下:
disown -h jobspec : 讓某個作業忽略HUP信號。
disown -ah : 讓所有作業忽略HUP信號。
disown -rh : 讓正在運行的作業忽略HUP信號。
針對作業,適用於運行時比如加了 & 的命令,使用此命令後會將其從作業列表中刪除,如果是前台運行的命令的話,可以先按Ctrl+Z,然後bg jobspec,再使用disown即可。