天天看點

【工具】screen 的使用

    當我們使用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/

繼續閱讀