對於linux運維,我們都是使用ssh登錄到服務器,如果我們運行的任務需要很長時間或不間斷運行,在我們直接關閉終端窗口或網絡不穩定的情況下,任務就會中斷,當然這只對於普通程序,不包括如mysqld,httpd這樣的守護進程。
解決思路:
1.讓進程運行在新的session(會話)里即不屬於此終端的子進程。
2.可以實現讓進程忽略HUP信號
解決方法:
1.nohup命令
功能:不掛斷地運行命令,忽略HUP信號。
語法:nohup command &
2.screen命令
此命令非常強大。如果非常多的命令都需要忽略HUP命令,screen可以解決這一問題。screen 提供了 ANSI/VT100 的終端模擬器,使它能夠在一個真實終端下運行多個全屏的偽終端。
用screen -dmS session name 來建立一個處於斷開模式下的會話(並指定其會話名)。
用screen -list 來列出所有會話。
用screen -r session name 來重新連接指定會話。
用快捷鍵CTRL-a d 來暫時斷開當前會話。
我的CentOS6.0上沒有screen命令,不過可以使用yum安裝。
[root@DigMouse ~]# yum list screen
Available Packages
screen.i686 4.0.3-15.el6 base
[root@DigMouse ~]# yum install screen*
復制代碼
Ok,系統有了screen命令了。
[root@DigMouse ~]# screen -r DigMouse
[root@DigMouse ~]# ping 51osos.com > /dev/null &
[1] 13789
[root@DigMouse ~]# pstree -H 13789
復制代碼
此時 bash 是 screen 的子進程,而 screen 是 init(PID為1)的子進程。那么當 ssh 斷開連接時,HUP 信號自然不會影響到 screen 下面的子進程了。
Ref:
https://blog.csdn.net/fightforyourdream/article/details/19159053