下麵介紹 screen 使用的技巧教你管理遠程會話 你是不是經常需要 SSH 或者 telent 遠程登錄到 Linux 伺服器?你是不是經常為一些長時間運行的任務而頭疼,比如系統備份、 ftp 傳輸等等。通常情況下我們都是為每一個這樣的任務開一個遠程終端視窗,因為他們執行的時間太長了。必須等待它執 ...
下麵介紹 screen 使用的技巧教你管理遠程會話
你是不是經常需要 SSH 或者 telent 遠程登錄到 Linux 伺服器?你是不是經常為一些長時間運行的任務而頭疼,比如系統備份、
ftp 傳輸等等。通常情況下我們都是為每一個這樣的任務開一個遠程終端視窗,因為他們執行的時間太長了。必須等待它執行完畢,
在此期間可不能關掉視窗或者斷開連接,否則這個任務就會被殺掉,一切半途而廢了。
元凶:SIGHUP 信號
讓我們來看看為什麼關掉視窗/斷開連接會使得正在運行的程式死掉。
在Linux/Unix中,有這樣幾個概念:
- 進程組(process group):一個或多個進程的集合,每一個進程組有唯一一個進程組ID,即進程組長進程的ID。
- 會話期(session):一個或多個進程組的集合,有唯一一個會話期首進程(session leader)。會話期ID為首進程的ID。
- 會話期可以有一個單獨的控制終端(controlling terminal)。與控制終端連接的會話期首進程叫做控制進程(controlling process)。
- 當前與終端交互的進程稱為前臺進程組。其餘進程組稱為後臺進程組。
我們來看一個例子。打開兩個SSH終端視窗,在其中一個運行top命令。
1 |
[root@tivf09 root]# top
|
在另一個終端視窗,找到top的進程ID為5180,其父進程ID為5128,即登錄shell。
1 2 3 |
[root@tivf09 root]# ps -ef|grep top
root 5180 5128 0 01:03 pts/0 00:00:02 top
root 5857 3672 0 01:12 pts/2 00:00:00 grep top
|
使用pstree命令可以更清楚地看到這個關係:
1 2 |
[root@tivf09 root]# pstree -H 5180|grep top
|-sshd-+-sshd---bash---top
|
使用ps-xj命令可以看到,登錄shell(PID 5128)和top在同一個會話期,shell為會話期首進程,所在進程組PGID為5128,top所在進程組PGID為5180,為前臺進程組。
1 2 3 4 |
[root@tivf09 root]# ps -xj|grep 5128
5126 5128 5128 5128 pts/0 5180 S 0 0:00 -bash
5128 5180 5180 5128 pts/0 5180 S 0 0:50 top
3672 18095 18094 3672 pts/2 18094 S 0 0:00 grep 5128
|
關閉第一個SSH視窗,在另一個視窗中可以看到top也被殺掉了。
1 2 |
[root@tivf09 root]# ps -ef|grep 5128
root 18699 3672 0 04:35 pts/2 00:00:00 grep 5128
|
如果我們可以忽略SIGHUP信號,關掉視窗應該就不會影響程式的運行了。nohup命令可以達到這個目的,如果程式的標準輸出/標準錯誤是終端,nohup預設將其重定向到nohup.out文件。值得註意的是nohup命令只是使得程式忽略SIGHUP信號,還需要使用標記&把它放在後臺運行。