當咱們用ssh或是telent遠程登陸到linux服務器上,運行一些長時間的任務,必須等待任務完成才能離開該界面。在此期間不能關閉窗口或者斷開鏈接。不然這個任務的進程就會別殺掉,一切半途而廢,須要從新執行該任務。linux
如何解決這個問題?shell
首先來理解幾個概念:服務器
進程組:一個或多個進程的集合,每一個進程組有惟一一個進程組ID,即進程組長進程的ID網絡
會話期:一個或多個進程組的集合,有惟一一個會話期首進程,會話期ID爲首進程的IDssh
會話期能夠有一個單獨的控制終端,與控制終端鏈接的會話期首進程叫控制進程,當前與終端交互的進程爲前臺進程。進程
掛斷信號默認的動做爲終止程序登錄
當終端藉口檢測到網絡鏈接斷開,將掛斷信號發送給控制進程終端
若是會話期首選進程終止,則該信號發送到該會話期前臺進程組程序
一個進程退出致使一個孤兒進程組中產生時,若是任意一個孤兒進程組處於stop狀態,發送SIGHUP和SIGCONT信號到該進程組的全部進程。command
所以,當網絡斷開或終端窗口關閉後,控制進程收到SIGHUP信號退出,會致使該會話期內其餘進程退出
方法一:nohup
#nohup command &
方法二:screen
creen 是一個能夠在多個進程間多路複用一個物理終端的窗口管理器。
使用方法:
(1),[xuefeng@ku6]# screen
screen將建立一個執行shell的全屏窗口,你能夠執行任意shell,就像在ssh窗口同樣。
(2),[xuefeng@ku6]#screen vi abc
screen建立一個執行vi abc的單獨窗口會話,退出vi 將退出該窗口
(3),還能夠在已有screen會話窗口中建立新的窗口,在當前sceen窗口中鍵入C-a c,即Ctrl+a,再按下c鍵。從新控制各窗口中運行的程序。
例如:在一個screen窗口中編輯vi /tmp/abc,以後須要做另外的事情,那麼能夠在screen窗口鍵入C-a d,screen會提示暫時中斷會話。繼續前一個會話,#screen -ls 查看會話編號。從新鏈接screen -r 編號。