歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 讓Linux的進程不受終端影響

讓Linux的進程不受終端影響

日期:2017/2/28 16:22:53   编辑:Linux教程

使用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即可。

Copyright © Linux教程網 All Rights Reserved