當我們使用securecrt,putty, 等連接配接遠端伺服器時,如果正在執行一個程式,比如shell 腳本,退出目前的視窗會導緻程式終止!其原理如下:
根據POSIX.1定義:
1 挂斷信号(SIGHUP)預設的動作是終止程式。
2 當終端接口檢測到網絡連接配接斷開,将挂斷信号發送給控制程序(會話期首程序)。
3 如果會話期首程序終止,則該信号發送到該會話期前台程序組。
一個程序退出導緻一個孤兒程序組中産生時,如果任意一個孤兒程序組程序處于STOP狀态,發送SIGHUP和SIGCONT信号到該程序組中所有程序。
使用一個例子:securecrt 通過ssh 連接配接遠端伺服器
在會話1 執行top指令
在會話2 進行檢視top程序ID 為20543 其父程序為12158,即登入shell。
[root@rac3 sh]# ps -ef | grep top
root 20543 12158 0 19:23 pts/1 00:00:00 top
root 20578 12189 0 19:25 pts/2 00:00:00 grep top
使用pstree 指令檢視上述關系
[root@rac3 sh]# pstree -H 20543 | grep top
|-sshd-+-sshd---bash---top
[root@rac3 sh]# ps -xj | grep 20543
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
12156 12158 12158 12158 pts/1 20543 Ss 0 0:00 -bash
12158 20543 20543 12158 pts/1 20543 S+ 0 0:00 top
12189 20569 20568 12189 pts/2 20568 R+ 0 0:00 grep 20543
[root@rac3 sh]#
由ps -xj 指令檢視top 指令和登入的shell -bash同屬于一個會話期,shell為會話期首程序,做在程序組為12158 ,top 指令所在的PGID 為20543,為前台程序組!
關閉第一個會話,top指令被kill 掉!
[root@rac3 sh]# ps -ef | grep top
root 20845 12189 0 19:35 pts/2 00:00:00 grep top
如何避免SIGHUP信号中斷導緻目前視窗執行的指令被迫中斷,大家會想到nohup,使用如下方法:
nohup command &
使得command 指令在背景執行。但是對于nohup的用法未免有些簡單 ,我們可以使用一個更加強大的指令--screen。
Screen是一個可以在多個程序之間多路複用一個實體終端的視窗管理器。Screen中有會話的概念,使用者可以在一個screen會話中建立多個screen視窗,在每一個screen視窗中就像操作一個真實的telnet/SSH連接配接視窗那樣。在screen中建立一個新的視窗有這樣幾種方式:
檢視系統是否安裝screen
[root@rac3 sh]# rpm -qa|grep screen
screen-4.0.3-1.el5
gnome-screensaver-2.16.1-8.el5
如果沒有安裝則可以使用yum install screen 來安裝screen
Screen指令文法:
screen [-AmRvx -ls -wipe][-d ][-h ][-r ][-s ][-S ]
Screen指令參數:
-A -[r|R] 将所有的視窗都調整為目前終端機的大小。
-c filename 用指定的filename檔案替代screen的配置檔案’.screenrc’.
-d [pid.tty.host] 斷開screen程序(使用該指令時,screen的狀态一定要是Attached,也就是說有使用者連在screen裡)。一般程序的名字是以pid.tty.host這種形式表示(用screen -list指令可以看出狀态)。
-D [pid.tty.host] 與-d指令實作一樣的功能,差別就是如果執行成功,會踢掉原來在screen裡的使用者并讓他logout。
-h 指定視窗的緩沖區行數。
-ls或–list 顯示目前所有的screen作業。
-m 即使目前已在作業中的screen作業,仍強制建立新的screen作業。
-p number or name 預先選擇一個視窗。
-r [pid.tty.host] 恢複離線的screen程序,如果有多個斷開的程序,需要指定[pid.tty.host]
-R 先試圖恢複離線的作業。若找不到離線的作業,即建立新的screen作業。
-s shell 指定建立新視窗時,所要執行的shell。
-S 指定screen作業的名稱。(用來替代[pid.tty.host]的命名方式,可以簡化操作).
-v 顯示版本資訊。
-wipe 檢查目前所有的screen作業,并删除已經無法使用的screen作業。
-x 恢複之前離線的screen作業。
進入screen的具體的方法:
1 直接輸入 screen 指令,會進入由screen建立的全新的視窗。
[root@rac3 ~]# screen
Screen将建立一個執行shell的全屏視窗。你可以執行任意shell程式,就像在ssh視窗中那樣。在該視窗中鍵入exit退出該視窗,如果這是該screen會話的唯一視窗,該screen會話退出,否則screen自動切換到前一個視窗。
2 screen 後面直接跟 要執行的指令:
[root@rac3 ~]# screen vi hivedb.sh
之後使用ctrl+a d 指令中斷目前的screen會話,但是當你再次進入的時候,依然是退出時候的狀态!
參考文檔:
http://www.ibm.com/developerworks/cn/linux/l-cn-screen/