【工具】screen 的使用

楊奇龍發表於2012-02-14
    當我們使用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
[root@rac3 sh]# 
如何避免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/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-716291/,如需轉載,請註明出處,否則將追究法律責任。

相關文章