SIGHUP挂断信号与screen
http://hi.baidu.com/guoshicheng_fd/item/08285c8b0a9c3259840fabe2
ubuntu下使用 screen 管理你的远程会话-彻底拜托nohup-II
screen是系统管理员手中的一件利器,下面我把它介绍给你,相信你会和我一样,认可这个非常棒的软件
一,什么情况下会用到screen?
比如说,我们在运行一个非常费时间的程序,注意:可能我们是在通过ssh远程连接到托管在机房中的机器上,
如果这个期间,网络出现中断(这个可以说是很正常的情况,别不信,我讲一件我亲历的例子),
则我们正在运行的程序就会中止(为什么会这样?我稍后解答)
如何保证当网络连接断开后,程序仍然在继续运行?而且可以随时的取回我们的屏幕?
答案就是screen
说明:1,我们做技术工作,要把各种极限情况考虑在内:有一个例子:有一次我在做 reiserfsck
(我通过ssh远程连接到托管在机房中的机器上)
那个分区的容量是2T,在进行了一半多(5个多小时过去了)我们的网络管理员不小心碰到了
路由器的电源线,完了,所有的一切都要重新开始,当时我还不会使用screen,
否则可以避免这场灾难。
2,网络中断后,我们远程运行的程序会自动中止,这个是为什么?
很简单,实验一下,我们现在就ssh到一台机器上,
我们运行这个命令: ps auxfww
注意: f参数: forest 就是以树结构来显示进程
root 756 0.0 0.0 3508 336 ? S 2008 11:20 /usr/sbin/sshd
root 8933 0.0 0.1 6776 1820 ? S 23:52 0:00 \_ /usr/sbin/sshd
root 8935 0.0 0.1 5616 1512 pts/3 S 23:52 0:00 \_ -bash
root 8977 0.0 0.0 2900 952 pts/3 R 23:53 0:00 \_ ps auxfww
可以看到当前正在执行的 ps auxfww 这个命令的位置,它的父进程是 -bash,而 -bash则是建立在pts/3这个tty上面
当网络中断时,pts/3上面所建立的连接会终止,当8935这个进程停止时,我们在其下面运行的命令自然也会停止。
3,多问一个问题,会nohup不可以吗?
这个问题问得好,用nohup当然可以,但注意:nohup需要把进程扔到后台去运行,仍以上面的reiserfsck为例,
运行此命令时需要和程序进行交互,这种情况下用nohup就没办法输入了。
而且screen有更多更强大的功能,当然更值得学习
二, 安装screen
screen不是标配的命令,但是centos的yum源中包含,用
yum install screen即可实现安装。
它的官网:http://www.gnu.org/software/screen/
三,使用screen的例子:
1,运行screen
screen -S down_video
直接运行screen就可以启动一个session(会话),但是还是给它做一下命名比较好,
这样可以避免和其他的session混淆,更可以一目了然的知道这个session的功能
说明 : -S 给session命名
2,如何列出系统中已在运行的screen session?
screen -ls
或着 screen -list
例子:
[root@dev ~]# screen -ls
There is a screen on:
4083.down_video (Attached)
1 Socket in /var/run/screen/S-root.
说明(Attached和Detached是screen session的两种状态,分别表示:正在被连接 和 已经被断开)
3,取回我们的screen
进入screen之后,此时我们可以进行我们的工作,
比如我要用wget 下载一个大型的视频 或用php写入大量的数据等
注意此时我们不用再担心我们到此远程机器的连接断开,
可以在此时直接关闭窗口
然后我们重新ssh连接到此远程机器,
登录后用screen -ls进行检查
[root@dev ~]# screen -ls
There is a screen on:
4083.down_video (Detached)
1 Socket in /var/run/screen/S-root.
状态显示 down_video这个screen session已经被 断开(detach)
此时我们用screen -r可以取回进行,
说明: -r :取回一个已被断开的screen session
例: [root@dev ~]# screen -r down_video
可以看到我们的程序仍在运行,中间未曾停止,而且此时我们又可以控制它了。
4,如何中断一个 screen session?
看例子:
[root@dev ~]# screen -ls
There is a screen on:
4083.down_video (Attached)
1 Socket in /var/run/screen/S-root.
请注意: 当前看到的session : down_video 正在被连接使用中,
这时我想使用此session
[root@dev ~]# screen -r down_video
There is a screen on:
4083.down_video (Attached)
There is no screen to be resumed matching down_video.
此时用 -r 不能取到此 screen session
这时只能用 -d 参数来强制中断它
[root@dev ~]# screen -d down_video
[4083.down_video detached.]
[root@dev ~]# screen -r down_video
再用 -r 取回 screen就成功了
注意:原来的被我们中断的连接会显示 :
[root@dev ~]# screen -r down_video
[remote detached]
四:使用screen进行远程协作:
1,什么情况下会用到这个远程协作?
比如:你需要给在远方的同事在一台服务器上面演示一项功能的操作步骤,
又如:你和同事需要连接到同一台服务器上面协作完成一项工作,每个人执行其中的一部分
2,步骤:
需要有一个人先登录到服务器,比如你的伙伴先登录,
登录后执行:
[root@dev ~]# screen -S cooperate
下面我们以同一帐号登录到同一台机器上面:
先查看情况:
[root@dev ~]# screen -ls
There is a screen on:
4195.cooperate (Attached)
1 Socket in /var/run/screen/S-root.
我们可以看到cooperate这个session是正在被连接的,
下面我们连接进入此session,即: 我们和伙伴使用同一个帐号进入同一个screen session
[root@dev ~]# screen -x cooperate
说明: -x:Attach to a not detached screen session. (Multi display mode)
就是连接 到一个未被断开的screen session,
注意此时两边的显示内容是完全相同,
注意:此时我们和伙伴都可以输入命令了,大家在一个session开始协同工作,
比如:咱们在这边执行: ls
伙伴的屏幕上会有相同的显示信息
3,从会话中退出:
如果只有一个人想退出,那么关闭终端的窗口即可
如果不想关闭窗口,可以在screen中输入 ctrl-a d (按住ctrl不放,再按a,放开两者后按d)
如果两个均想退出,任一方在screen中输入exit即可
下面我再说一句:
screen的功能可不止于此,它还有很多巨强大的功能,我的一个系统管理员朋友说:"我在工作中简直离不开screen了",其他的功能,我会专门再写一篇内容进行介绍
===========================================================================
http://www.orczhou.com/index.php/2010/08/linux-screen-how-to/
Linux下使用screen工作How-to
通过ssh在Linux终端下工作,有一个很烦的事情就是,如果需要执行一个长时间的命令(例如拷贝一个大文件,或者做DDL)时,如果终端意外断开(网络或者别的原因),一般命令就会终止,当然你可以使用nohup命令,这里提供另一个办法:使用screen。
一般,我们创建一个screen会话,然后连接会话并在会话下工作,这时候,我们可以随时挂起会话,去做别的事情,而且这个挂起的会话会一直在后台执行。而后又可以重新连接会话。下面是一个简单的How-to:
该命令,创建一个名为supu的会话,当时并不立刻进入会话。
连入会话后,就可以做任何想做的工作了。
如果你在会话中,做了某个需要等很久的操作,或者你需要离开一段时间,这时就需要执行挂起操作了:
(ctrl+a) + D 先按下Ctr+a然后按D键(screen捕获ctrl+a,后面跟一个命令键D,可以通过ctrl+a ?查看更多)
而后,可以重新使用-r参数回到会话;在会话中,用exit可以退出并关闭这个会话;还可以使用screen -ls命令来查看当前的全部会话状态。
一般screen -ls可以看到多个会话状态,例如:
Detached表示会话处于挂起状态,Attached表示有终端在连接会话。
“22872.supu”这是会话名。22872是一个唯一会话ID,后面supu是自定义的会话名,可以使用screen -r 22872等同于screen -r supu。
Enjoy!
参考:linux 技巧:使用 screen 管理你的远程会话 | man screen
Update(2010-10-08) :
There is a screen on:
9348.supu (Detached)
1 Socket in /var/run/screen/S-supu.
可以通过kill -9 9348杀死该会话,然后通过screen -wipe清理被杀死的会话。
--------------------------------------------------------------------------------------------------------------------------------
http://hi.baidu.com/jamesbond668/item/01905b00bdee04d71ff046ea
傳統在 Linux 系統上,若是人在主機前面時,通常可以透過 Virtual Console 的功能,直接按下 Ctrl-Alt-F1 ~ Ctrl-Alt-F12 等按鍵切換多個終端機來使用,而在 X Window 下也可以開啟終端機模擬程式來提供多個畫面操作的功能。不過,目前到是有另外一個很簡單而且好用的程式,那就是 screen。
Screen 程式簡介
Screen
程式本身為 GNU 專案計劃旗下的程式,稱呼為 Virtual Terminal Manager,也就是提供多個終端機存取管理的程式。透過
screen
程式的終端機管理,能夠提供更多終端機環境使用,包含畫面的剪貼複製、即時訊息字集轉碼,甚至能夠讓使用者登出主機下讓程式運作,下次再登入主機時能夠將
剛剛工作接回來繼續使用等功能。
Screen 程式安裝
Screen 程式本身大多已經收錄在每個 Linux Distribution 內了,所以通常只要安裝系統時會一起安裝進去。若是當初沒有安裝上的話,請多利用各家 Linux Distribution 提供的整合套件管理程式安裝上。
如下提供常見的 Linux 發行版本安裝使用方式:
Fedora Linux:yum install screen
Mandriva Linux:urpmi screen
SuSE Linux:yast -i screen
Debian Linux:apt-get install screen
Screen 程式開始使用
當套件安裝好後,直接於命令列執行 screen,那就可以進入 screen 的環境了。
Screen 程式按鍵操作
Screen
程式所有按鍵都非常特殊,都是以 Ctrl 鍵再加上 a 開始的按法。比方一般表示所謂 C-a c,也就是表示先著 Ctrl 再按下
a,然後請再放開 a 按鍵,再按下 c鍵。這樣的表示方式,有點類似於 emacs 與
xemacs軟體的操作按法,一開始可能有點不習慣,不過請多按幾次就會習慣這樣的按鍵配置方式了。
Screen 程式按鍵使用
當執行 screen 後,整個操作還是在 shell 環境下使用,不過終端機環境配置卻已經是由 screen 所管理。下面就列出常見的一些按鍵使用,提供於終端機環境內的一些新增、結束與切換等方式。
常用視窗管理切換按鍵
C-a c
建立一個新的視窗
C-a n
切換到下一個視窗 (順序的切換)
C-a p
切換到上一個視窗 (順序的切換)
C-a 0~9
切換到指定的編號視窗
C-a “
光棒方式指定切換到指定視窗
C-a w
列出所有視窗清單狀態
C-a K
關閉所有開啟的視窗並結束 screen 程式
單一視窗環境的按鍵使用
C-a C
清除目前視窗的畫面
C-a g
虛擬的嗶聲切換 (畫面閃動提示或是實際嗶聲)
C-a p
切換到上一個視窗 (順序的切換)
C-a i
目前是視窗的資訊狀態
C-a l
重繪目前的畫面內容
C-a w
列出所有視窗清單狀態
筆者一般跑 screen 程式後,會先按下 C-a g,表示切換到實際嗶聲環境,後續跑的程式若是有輸出 beep 聲音,就會聽到實際聲音。後續執行某一個程式時,若是還有其他事情要處理,就會按下 C-a c 建立一個新的視窗去處理,然後操作過程中可以按下
C-a n 快速查看剛剛跑的程式到怎樣的進度了。
其實使用方式光看筆者描述可能非常抽象模糊,我建議各位讀者就先跑 screen 程式,然後依據這些按鍵測看看就知道實際操作方式了。
Screen 程式畫面複製與捲軸功能
Screen 程式除了一般視窗建立與切換之外,另外常用的功能就是文字區塊的複製,以及畫面捲頁顯示功能。進入該功能的按鍵為 c-a [,該模式下提供如下按鍵操作,如下列表。
畫面複製與捲軸功能
C-f
往前面捲動一頁
C-b
往下面捲動一頁
/
往下尋找指定字串
?
往上尋找指定字串
enter
將指定區間內容複製到緩衝區內
esc
離開該模式
C-a ]
將緩衝區內文字貼到目前位置
不知道讀者是否發現,這些按鍵好像與 vim 很類似,對吧?所以若是熟悉 vi 操作的話,會發現這些按鍵都非常熟悉,使用上也會非常順手。
Screen 程式 Session 管理
當
執行 screen 程式後,所在的終端機配置環境對於 screen 來說就是一個 session 環境。screen 提供了一組按鍵為 C-a
d,當使用者按下該組合按鍵時,screen 會將自己常駐於系統內,然後脫離原本 screen 環境而切換為回到原本執行 screen
程式之前的環境。
此時雖然剛剛於 screen 程式看起來都消失了,不過上剛剛在 screen
環境內跑的程式項目並沒有結束,事實上他們還是繼續執行著,只是我們暫時脫離 screen 的操作環境所以看不到。之前啟動 screen
程式時,不管是直接於主機前登入的,還是使用 ssh client 登入的都好,這時候都可以盡管安心的登出主機去忙其他事情,
剛剛哪些跑的程式都會繼續在 screen 環境下跑的好好的。
那,後續再登入主機主機後,怎樣重新把哪些 session
項目呼喚回來呢?通常只要執行 screen -r 就可以重新接回剛剛跑的工作項目了。不過若是使用者有啟動多個 screen
程式的話,那可能會出現下面的畫面告知有多個 session 清單可以選擇使用。
There are screens on:
21373.pts-0.kenduest (Detached)
27329.pts-11.kenduest (Detached)
There is no screen to be resumed.
所
以請執行 screen -r 21373 或者是 screen -r 27329 方式指定切換到指定的 session 項目即可。
那可以列出目前所有的 session 項目嗎?screen 提供了 -ls 或是 -list 參數提供檢視所有 session 清單功能。
screen -ls 或 screen -list
Screen 程式 Attached/Detached Session 管理
當執行screen -ls 檢視檢視所有 session 清單功能,通常 session狀態表示常見有 “Attached” 與 “Detached” 兩種狀態,其顯示如下。
There are screens on:
21373.pts-0.kenduest (Attached)
27329.pts-11.kenduest (Detached)
There is no screen to be resumed.
其 中 “Attached” 表示該 session 連結使用中,而 “detached” 表示該 session 已經被使用者按下 C-a d 暫時脫離了 screen 環境。對於目前狀態為 “Detached” session 項目一般要把指定的 session 接回來使用可以使用 screen –r 即可。不過若是要接回上面使用中的 “Attached” session 通常會出現如下訊息:
There are screens on:
21373.pts-0.kenduest (Attached)
There is no screen to be resumed matching 21373.
若是要強迫接回該 session 的話,通常可以執行如下指令
screen -dr 21373
其中 -dr 就是先 detached 該 session 後,再 restore 切換接應回來使用。當然,也可以先跑 -d 再用 -r 參數來處理也是可以的。
screen -d 21373 (這表示 detach 該 session)
screen -r 21373 (這表示 attach 該 session)
不
過哪時候會需要用到先 detach 再重新 attach 該 session 功能呢?通常一般若是遠端登入到 Linux
主機時,操作過程因為自己網路斷掉或者是意外的自己當機時,下次重新連線到主機跑 screen -r 時就會遇到該 session 因為沒有正常
detach 所以還處於 attached 的狀態。當遇到這個情況時,就可以使用該方式重新連接回該 session 繼續使用。
Screen 程式其他Session 管理
一般有正常結束 screen 程式時,通常 screen 也會一並把 session資訊配置檔案刪除掉。而若是不正常結束時,像是跑 screen 的主機本身跳電或者是有重新開機過時,執行 screen -ls 通常可以看到如下的清單結果:
There are screens on:
27522.pts-1.linux2 (Dead ???)
Remove dead screens with 'screen -wipe'.
1 Socket in /home/users/kenduest/tmp.
這時候可以執行 screen -wipe,screen 會將遺留在主機已經沒有作用的 unix domain socket 檔案清除掉,還給系統乾淨的檔案配置狀態。
後記事項
透
過這樣的就介紹,我想讀者應該會更簡單明瞭 screen 程式的奧妙,因為就算是在遠端使用 ssh client
連線到主機時,還是能夠享受多個終端機環境的操作使用。而對於像是 Novell 的 NCLP 上機的認證考試來說,若是可以多利用 screen
程式的話,我想實際系統操作議題上也會更為快速與便利。
關於 screen 程式使用方式,本篇只有很簡單的快速介紹了該程式使用方式,而讀者若是對於對 screen 程式有興趣的話,請多利用系統提供的 man page or info page 相關資訊來查閱詳細使用方式。
參考文件
1. 系統提供的文件 man screen 與 info screen
2. screen 官方網站 http://www.gnu.org/software/screen/
全文完
作者:小州老師,聯成電腦專任講師
###############################################################################
http://www.ibm.com/developerworks/cn/linux/l-cn-screen/
你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连 接,否则这个任务就会被杀掉,一切半途而废了。
让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。
在Linux/Unix中,有这样几个概念:
- 进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
- 会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
- 会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
根据POSIX.1定义:
- 挂断信号(SIGHUP)默认的动作是终止程序。
- 当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
- 如果会话期首进程终止,则该信号发送到该会话期前台进程组。
- 一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。
因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。
[root@tivf09 root]# top |
在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登录shell。
[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命令可以更清楚地看到这个关系:
[root@tivf09 root]# pstree -H 5180|grep top |-sshd-+-sshd---bash---top |
使用ps-xj命令可以看到,登录shell(PID 5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。
[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也被杀掉了。
[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信号,还需要使用 标记&把它放在后台运行。
nohup <command> [argument…] & |
虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。
其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。
[root@tivf06 ~]# rpm -qa|grep screen xscreensaver-4.18-5.rhel4.11 screen-4.0.2-5 |
简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可 以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen 中创建一个新的窗口有这样几种方式:
1.直接在命令行键入screen命令
[root@tivf06 ~]# screen |
Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。
2.Screen命令后跟你要执行的程序。
[root@tivf06 ~]# screen vi test.c |
Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。
3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c
,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。
screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/abc文件:
[root@tivf06 ~]# screen vi /tmp/abc |
之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d
,Screen会给出detached提示:
半个小时之后回来了,找到该screen会话:
[root@tivf06 ~]# screen -ls There is a screen on: 16582.pts-1.tivf06 (Detached) 1 Socket in /tmp/screens/S-root. |
重新连接会话:
[root@tivf06 ~]# screen -r 16582 |
看看出现什么了,太棒了,一切都在。继续干吧。
你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前 screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫 做键绑定(key binding),C-a叫做命令字符(command character)。
可以通过C-a ?
来查看所有的键绑定,常用的键绑定有:
C-a ? | 显示所有键绑定信息 |
---|---|
C-a w | 显示所有窗口列表 |
C-a C-a | 切换到之前显示的窗口 |
C-a c | 创建一个新的运行shell的窗口并切换到该窗口 |
C-a n | 切换到下一个窗口 |
C-a p | 切换到前一个窗口(与C-a n相对) |
C-a 0..9 | 切换到窗口0..9 |
C-a a | 发送 C-a到当前窗口 |
C-a d | 暂时断开screen会话 |
C-a k | 杀掉当前窗口 |
C-a [ | 进入拷贝/回滚模式 |
使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:
因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:
-exy x为命令字符,y为转义命令字符的字符
下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。
[root@tivf18 root]# screen -e^tt |
其他常用的命令选项有:
-c file | 使用配置文件file,而不使用默认的$HOME/.screenrc |
---|---|
-d|-D [pid.tty.host] | 不开启新的screen会话,而是断开其他正在运行的screen会话 |
-h num | 指定历史回滚缓冲区大小为num行 |
-list|-ls | 列出现有screen会话,格式为pid.tty.host |
-d -m | 启动一个开始就处于断开模式的会话 |
-r sessionowner/ [pid.tty.host] | 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限 |
-S sessionname | 创建screen会话时为会话指定一个名字 |
-v | 显示screen版本信息 |
-wipe [match] | 同-list,但删掉那些无法连接的会话 |
下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r <screen_pid>重新连接上:
[root@tivf18 root]# screen –ls There are screens on: 8736.pts-1.tivf18 (Detached) 8462.pts-0.tivf18 (Detached) 2 Sockets in /root/.screen. [root@tivf18 root]# screen –r 8736 |
如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:
[root@tivf18 root]# kill -9 8462 [root@tivf18 root]# screen -ls There are screens on: 8736.pts-1.tivf18 (Detached) 8462.pts-0.tivf18 (Dead ???) Remove dead screens with 'screen -wipe'. 2 Sockets in /root/.screen. [root@tivf18 root]# screen -wipe There are screens on: 8736.pts-1.tivf18 (Detached) 8462.pts-0.tivf18 (Removed) 1 socket wiped out. 1 Socket in /root/.screen. [root@tivf18 root]# screen -ls There is a screen on: 8736.pts-1.tivf18 (Detached) 1 Socket in /root/.screen. [root@tivf18 root]# |
-d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname
启动一个初始状态断开的screen会话:
[root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test |
连接该会话:
[root@tivf06 tianq]# screen -r mygdb |
先来看看如何使用screen解决SIGHUP问题,比如现在我们要ftp传输一个大文件。如果按老的办法,SSH登录到 系统,直接ftp命令开始传输,之后。。如果网络速度还可以,恭喜你,不用等太长时间了;如果网络不好,老老实实等着吧,只能传输完毕再断开SSH连接 了。让我们使用screen来试试。
SSH登录到系统,在命令行键入screen。
[root@tivf18 root]# screen |
在screen shell窗口中输入ftp命令,登录,开始传输。不愿意等了?OK,在窗口中键入C-a d:
然后。。退出SSH登录?随你怎样,只要别杀掉screen会话。
是不是很方便?更进一步,其实我们可以利用screen这种功能来管理你的远程会话,保存你所有的工作内容。你是不是每次 登录到系统都要开很多窗口,然后每天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗 口,退出的时候C-a d“保存”你的工作,下次登录后直接screen -r <screen_pid>就可以了。
最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:
使用telnet:
Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME /.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。 如果你愿意的话,也可以自己指定screen配置文件。
以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文 件内容请参考screen的man页。
- “Advanced Programming in the UNIX® Environment: Second Edition” W. Richard Stevens, Stephen A. Rago 提供了更多关于Linux/Unix进程关系、信号的知识。
- GNU Screen的官方网站:http://www.gnu.org/software/screen/
- Screen的man page提供了最详细的信息:http://www.slac.stanford.edu/comp/unix/package/epics/extensions/iocConsole/screen.1.html
==================================
http://www.opstool.com/article/177
Screen是一个非常好用的Linux工具,同时它很好地弥补了PuTTY这个ssh终端没有多个标签的功能。
一个不错的screen配置文件如下:
- #保存在home下.screenrc
- # 屏幕缓冲区4096行
- defscrollback 4096
- # 下标签设置
- hardstatus on
- hardstatus alwayslastline
- hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %{..Y} %m/%d %C%a"
- termcapinfo rxvt 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'
- termcapinfo xterm ti@:te@
- termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'
- #关闭闪屏
- vbell off
配置文件比较简单,将它保存在家目录的.screenrc下,然后执行screen,就可以看到效果。如果还没有安装screen,请立马yum install -y screen
screen运行后,窗口标签的效果图如下:
要是screen下方显示主机名标签,需要在目标主机添加一下配置文件,/etc/sysconfig/bash-prompt-screen内容是如下
- #!/bin/bash
- echo -n -e "\033k`uname -n`\033\\"
并增加可执行权限
- chmod +x /etc/sysconfig/bash-prompt-screen
常用的screen快捷键:
- Ctrl+a,然后按c :创建新的窗口
- Ctrl+a,然后按数字 :切到相应的数字对应的窗口
- Ctrl+a,然后按" :列出所有的screen窗口,然后通过上下键选择,这样对于screen窗口数大于10个的情况非常实用,因为窗口数大于10个时,无法通过Ctrl+a然后按数字切换了。
有人可能对screen不屑,“我用SecureCRT已经有标签功能,screen这样的工具就不需要了”
但是作为一个系统管理员,肯定常常会遇到执行一个较长时间的命令的情况,这时要是笔记本忽然断网,那可能导致命令执行到一半就挂了。导致不必要的麻烦。如
果使用screen,这时你就可以screen恢复,即登录到服务器后,screen -r 即可恢复到之前断网时的屏幕
================================
http://blog.csdn.net/zly8602/article/details/5807231
由于经常需要在模拟终端上远程登上服务器做各种操作, 而且很多时候需要同时用不同的窗口登上不同的服务器, 本办法能让人一目了然的分辨出哪个窗口登陆的是哪台机器(最好是IP).
bash支持 环境变量PROMPT_COMMAND, 将其设置为一个命令行字符串或者是包含命令行字符串的一个文件的文件名, 命令行用来在显示prompt之前执 行. 在redhat系列的机器上(redhat,fedora)都支持文件/etc/sysconfig/bash-prompt-xterm来保存 bash+xterm下的PROMPT_COMMAND环境变量的内容, 结合这几点, 就可以轻松实现"在窗口标题部分显示已登陆服务器的ip地址"这 个功能.
1) 设置term类型是xterm时标签显示内容, 即$PROMPT_COMMAND环境变量的值:
# vi /etc/sysconfig/bash-prompt-xterm
-----------------------------------------------------------------------
echo -ne "/e]2;${USER}@$(/sbin/ifconfig eth0|grep 'inet addr'|sed -e 's/^.*inet addr:/(.*/) Bcast.*$//1/')/a"
-----------------------------------------------------------------------
说明:
"/e]2"是xterm支持的第三种escape序列, 用来设置窗口的标题;
"$(.*)"的内容是shell命令, 用来取出服务器eth0网卡的当前ip地址;
"/a"是xterm支持的escape序列的结束符.
2) 设置term类型是screen时(命令screen进入新窗口时)标签显示内容, 和xterm一样:
# cp /etc/sysconfig/bash-prompt-xterm /etc/sysconfig/bash-prompt-screen
3) 设置term类型不是xterm和screen时标签显示内容, 也和xterm一样:
# cp /etc/sysconfig/bash-prompt-xterm /etc/sysconfig/bash-prompt-default
4) 这几个文件需要有可执行权限:
# chmod +x /etc/sysconfig/bash-prompt-*
现在重新登录操作系统或者切换用户, 模拟终端如SecureCRT的标签栏就会动态更新了.
--End--
========================
http://www.linuxsir.org/bbs/thread366444.html
第一张图和第二章图, 运行screen的时候, 每个window的title为路径或者当前运行的程序, xterm的title为screen: 加上当前window的title
第三章图, 直接运行xterm, title为user@host: path, 这查了好多, 简单的不定义函数的只有zsh能显示当前运行程序, 这个可以算了, 坚守bash
screen的配置
- # Start message
- startup_message off
- # Caption line
- caption always "%{= R}[ %{=b b}%-w%{=rb db}%>%n %t%{-}%+w%{-b}%< %=%{R}][%{M}%D %M %d %{G}%c%{R}]"
- #这是状态栏, 就是时间那一行, 不用Hardstatus实现, 因为要把xterm的title伪装成Hardstatus
- # Disable vbell
- vbell off
- # Disable login
- deflogin off
- # Dynamic title
- shelltitle '$ |bash'
- #这个加bashrc里的设置实现显示路径或程序为标题
- # Utf-8 handling
- defutf8 on
- # Keyboard binding
- bindkey -k F1 prev
- bindkey -k F2 next
- # Set xterm's title
- hardstatus string "screen: %t"
- #%t就是当前window的标题
- #termcapinfo xterm* 'hs:ts=\E]0;:fs=\007:ds=\E]0;screen\007'
- #这句都说加, 但是我这加不加都行...
- # Automatically detach on hangup
- autodetach on
- # Make the xterm scroller work in screen
- termcapinfo xterm* ti@:te@
- # Refresh the display when exiting programs
- altscreen on
- # Sessions
- #screen
- #screen -t mutt mutt
- #screen -t irssi irssi
- #有个bug, debian sid中这里如果只用screen多开窗口, PS1什么的都对, 但是只能动态显示路径为title, 程序不行, C-a c新建的没问题, 欢迎反馈!!!
- #更新: session的配置放到最后就OK了, 但是这也算个bug吧, 毕竟其他的设置没有因为session的写的位置有过影响
bash的配置
- #screen and xterm's dynamic title
- #就是加上screen和xterm的escape sequences
- case $TERM in
- screen*)
- PATHTITLE='\[\ek\W\e\\\]'
- PROGRAMTITLE='\[\ek\e\\\]'
- PS1="${PROGRAMTITLE}${PATHTITLE}${PS1}"
- ;;
- xterm*)
- TITLEBAR='\[\e]0;\u@\h:\w\a\]'
- PS1="${TITLEBAR}${PS1}"
- ;;
- *)
- ;;
- esac
2010-04-19-221630_908x567_scrot.png
上传的缩略图大小:18.61KB
2010-04-19-221644_908x567_scrot.png
上传的缩略图大小:162.09KB
2010-04-19-221706_908x567_scrot.png
上传的缩略图大小:16.13KB
===================
http://hi.baidu.com/tjuer/item/a3452480db2aa92b100ef38b
linux中强大的screen命令
今天发现了一个“宝贝”,就是Linux的screen命令,对于远程登录来说,不仅提供了类似于nohup的功能,而且提供了我非常喜欢的“多个桌面”的功能。
平常开一个putty远程登录,经常需要在两个程序之间来回切换,怎么办?ctrl-z和fg、bg?这些太麻烦了。其实我们可以借助screen命令来实现轻松便捷的切换。
我主要是参考了下面的两篇文章(附在结尾),我自己总结的方法是:
“首
先用screen [-S]命令建立一个session,然后就可以在这个session中建立多个window了。使用screen
[-S]可以建立多个session,而每个session又可以建立多个window。在不同的window之间可以用Ctrl-A
n/p等命令来切换。而想要在多个session之间切换,则需要你Ctrl-A
d回到登录session(就像一棵大树的根),然后再通过screen -ls查看有哪些session,然后使用screen
-r来决定恢复到哪个session。对于已经Attached Session则不能直接screen -r,需要先screen
-d,然后才能screen -r”
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【转载1】
系统管理员经常需要远程登录服务器
然后在服务器上跑一些程序
有个时候
得跑很长时间(超过12小时)
这是如果程序没结束就退出远程管理终端
远程跑的程序很有可能就此当掉
以前常用的解决方式是用命令nohup
但是nohup也有很多的问题
当有了screen
这一切便都迎刃而解了
敲入命令screen
会创建一个跑着shell的单一窗口
在这里面
你可以跑你所需要的程序
然后Ctrl+a d退出刚创建的窗口(回到进入screen前的环境)
然后再敲入命令screen创建新的终端窗口
就这样
你可以建立多个有shell的窗口(这些窗口里都可以跑你自己的应用)
这样就是你退出远程管理窗口(进入screen的环境)
你的screen窗间的窗口都不会关闭
里面跑得应用自然也不会当掉
用screen -ls可以看所有的screen sessions
用screen -r sessionid可以进sessionid指定的特定的screen session
最后screen session不再使用的时候
screen -r sessionid进去
exit退出即可
Unix/Linux 工具: Screen 命令使用
screen使用
使用screen非常简易.只需在SHELL键入screen,便可打开一个screen session。
而在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
现在让我来简单介绍基本的命令
C-a c -> Create,开启新的 window
C-a n -> Next,切换到下个 window
C-a p -> Previous,前一个 window
more..
C-a C-a -> Other,在两个 window 间切换
C-a w -> Windows,列出已开启的 windows 有那些
C-a 0 -> 切换到第 0 个 window
C-a 1..9 -> 切换到第 1..9 个window
C-a a -> 发出 C-a,在 emacs, ve, bash, tcsh 下可移到行首
C-a t -> Time,显示当前时间,和系统的 load
C-a K(大写) -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、
复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上
C-a ? -> Help,显示简单说明
C-a d -> detach,将目前的 screen session (可能含有多个 windows)
丢
到后台执行 当按了 C-a d 把 screen session detach 掉后,会回到还没进 screen 时的状态,此时在 screen
session 里每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
下次 login 进来时:
screen -ls -> 显示所有的 screen sessions
screen -r [keyword] -> 选择一个screen session 恢复对话
若 screen -ls 里有 Attached sessions:
screen -d [keyword] -> 强制 detach,以便「接手」过来
实例:
说明看了那么多,让我们用一个实际例子来结束我们今天的学习。
在我们开启一个screen后,然后使用joe编辑一个文件,之后因为临时需要离开这时就可以运行Ctrl+a d,显示如下:
[becks@ec-base becks]$ screen
[detached]
这个时候当我们运行ps -e 可以看到pts/2这个我刚刚运行的screen正在运行joe
6264 pts/2 00:00:00 bash
6354 pts/2 00:00:00 joe
而当我们回来后想恢复这个session,只需要键入screen -r,而当你有多个session时候,系统将提示你选择一个,如下:
[becks@ec-base becks]$ screen -r
There are several suitable screens on:
6263.pts-1.ec-base (Detached)
6382.pts-1.ec-base (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
输入该session的pid进行恢复
[becks@becks becks]$ screen -r 6263
想退出screen的session,和退出shell一样,只需要键入exit命令,成功退出后将有以下提示
[screen is terminating]
【转载2】
linux screen 命令详解
功能说明:
使用telnet或SSH远程登录linux时,如果连接非正常中断,重新连接时,系统将开一个新的session,无法恢复原来的
session.screen命令可以解决这个问题。Screen工具是一个终端多路转接器,在本质上,这意味着你能够使用一个单一的终端窗口运行多终端
的应用。
语 法:
screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
补充说明:
screen为多重视窗管理程序。此处所谓的视窗,是指一个全屏幕的文字模式画面。通常只有在使用telnet登入主机或是使用老式的终端机时,才有可能用到screen程序。
参 数:
-A 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> 将指定的screen作业离线。
-h <行数> 指定视窗的缓冲区行数。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-v 显示版本信息。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
常用screen参数:
screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a ? -> Help,显示简单说明
C-a c -> Create,开启新的 window
C-a n -> Next,切换到下个 window
C-a p -> Previous,前一个 window
C-a 0..9 -> 切换到第 0..9 个window
Ctrl+a [Space] -> 由視窗0循序換到視窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个
windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里 每个 window
内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令則可回去。
C-a w -> Windows,列出已开启的 windows 有那些
C-a t -> Time,显示当前时间,和系统的 load
C-a K -> kill window,强行关闭当前的 window
===============
http://www.econsh.com/2011/08/linux%EF%BC%9A%E4%BD%BF%E7%94%A8-screen-%E5%88%9B%E5%BB%BA%E5%B9%B6%E7%AE%A1%E7%90%86%E5%A4%9A%E4%B8%AAshell%E7%AA%97%E5%8F%A3/
大家平常在linux上开发(通常是开发机或者是测试机)的时候,有没有觉得需要开N多个窗口?a 窗口看文件列表,b窗口做代码编辑,c窗口写makefile,d…。每次开始干活的时候都要依次打开这么多窗口,还得进入相应的目录,虽然自动登录和登 录后的动作可以部分解决这个问题,但是依然让人不爽。尤其是有的登录处于安全无法完全自动化,而登录后的动作又会经常有所变化。
使用 GNU Screen 就可以了。screen 可以在一个控制台(如Xshell、secureCRT)
登录 shell 中创建和管理多个 shell 窗口。可以从一个 shell
窗口迅速切换到另一个窗口,最重要的是一天的工作完了之后,不必退出这n多shell窗口,而只是将它们detach,然后退出登录,下次登录的时候可以
使用screen重新恢复上次连接的多个窗口。可以理解为是一个虚拟的远程主机,假如有一批服务开启了,如果你退出再次登录,他们都还在运行。
安装就不说了,配置会在后面说,先说下几个简单实用的命令吧,详细的命令man一下吧。
- screen:第一次使用的时候,输入screen,即新建了一个session,然后默认有一个shell窗口,下面会有状态栏显示窗口的名称,通常是“0 bash”。
- ctra a + A:假如你想重命名这个窗口,按ctra a,然后A,就可以重命名
- ctrl a + c:新建窗口
- screen -t name:新建名字为name的窗口
- ctrl a + n or p:切换窗口,n next,p previous
- ctrl a + “:列出所有的窗口,也可以在状态栏观察到
- screen -S name:新建一个session 名字为name
- ctra a + d:使得当前的session detached,这个是很重要的一个命令,这个命令使得你临时退出了该session,而下次可以进行重新连接
- screen -ls:想进行重新连接的时候,你需要知道你的screen session是哪一个,然后使用screen -r id命令,ls列出了所有的screen session的id,当然假如你使用screen -S name创建的session的话,会有一个名字,更便于记忆
- screen -r id/name:重新连接screen session id/name,即恢复访问你之前打开的诸多窗口
- exit:退出当前的窗口
- ctrl a + K:kill当前窗口
这些命令目前对于我来说已经足够了,然后来说说配置,默认的screen的配置是无法在状态栏上显示所有的窗口的,只能显示当前窗口的状态,当 然你可以用列表的方式,或者切换来访问其他的窗口。其实可以展示成类似标签的更好的方式,即可以使用状态栏在视觉上进一步区分各个窗口。启动您喜欢的文本 编辑器,在主目录中创建包含以下代码的 .screenrc 文件:
hardstatus on
hardstatus alwayslastline
hardstatus string “%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a
然后每个新窗口就会显示在状态栏,包含编号和名称,如“0 econsh”。
刚刚开始使用screen,虽然只是菜鸟级别,但是确实是个申请神器,因此迫不及待和大家分享一下:)
http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html
一、背景
系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连 接,否则这个任务就会被杀掉,一切半途而废了。
二、简介
GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。
GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
- 会话恢复
- 只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
- 多窗口
- 在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可 以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还 可以被分区和命名,还可以监视后台窗口的活动。
- 会话共享
- Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
GNU's Screen 官方站点:http://www.gnu.org/software/screen/
三、语法
# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
参数说明
-A 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> 将指定的screen作业离线。
-h <行数> 指定视窗的缓冲区行数。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-v 显示版本信息。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
四、常用screen参数
screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a
d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows)
丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process
(无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> Time,显示当前时间,和系统的 load
C-a k -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上
五、使用 screen
5.1 安装screen
流行的Linux发行版(例如Red Hat Enterprise Linux)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。
[root@TS-DEV ~]# yum install screen
[root@TS-DEV ~]# rpm -qa|grep screen
screen-4.0.3-4.el5
[root@TS-DEV ~]#
5.2 创建一个新的窗口
安装完成后,直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字,实践上推荐为每个screen会话取一个名字,方便分辨:
[root@TS-DEV ~]# screen -S david
screen启动后,会创建第一个窗口,也就是窗口No. 0,并在其中打开一个系统默认的shell,一般都会是bash。所以你敲入命令screen之后,会立刻又返回到命令提示符,仿佛什么也没有发生似的, 其实你已经进入Screen的世界了。当然,也可以在screen命令之后加入你喜欢的参数,使之直接打开你指定的程序,例如:
[root@TS-DEV ~]# screen vi david.txt
screen创建一个执行vi david.txt的单窗口会话,退出vi 将退出该窗口/会话。
5.3 查看窗口和窗口名称
打开多个窗口后,可以使用快捷键C-a w列出当前所有窗口。如果使用文本终端,这个列表会列在屏幕左下角,如果使用X环境下的终端模拟器,这个列表会列在标题栏里。窗口列表的样子一般是这样:
0$ bash 1-$ bash 2*$ bash
这个例子中我开启了三个窗口,其中*号表示当前位于窗口2,-号表示上一次切换窗口时位于窗口1。
Screen默认会为窗口命名为编号和窗口中运行程序名的组合,上面的例子中窗口都是默认名字。练习了上面查看窗口的方法,你可能就希望各个窗口可 以有不同的名字以方便区分了。可以使用快捷键C-a A来为当前窗口重命名,按下快捷键后,Screen会允许你为当前窗口输入新的名字,回车确认。
5.4 会话分离与恢复
你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/david.txt文件:
[root@TS-DEV ~]# screen vi /tmp/david.txt
之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d
,Screen会给出detached提示:
暂时中断会话
半个小时之后回来了,找到该screen会话:
[root@TS-DEV ~]# screen -ls
重新连接会话:
[root@TS-DEV ~]# screen -r 12865
一切都在。
当然,如果你在另一台机器上没有分离一个Screen会话,就无从恢复会话了。
这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:
5.5 清除dead 会话
如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:
5.6 关闭或杀死窗口
正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。
如果一个Screen会话中最后一个窗口被关闭了,那么整个Screen会话也就退出了,screen进程会被终止。
除了依次退出/杀死当前Screen会话中所有窗口这种方法之外,还可以使用快捷键C-a :,然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入split等,这也是实现Screen功能的一个途径,不过个人认为还是快捷键比较方便些。
六、screen 高级应用
6.1 会话共享
还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:
[root@TS-DEV ~]# screen -x
这个命令会将你朋友的终端Attach到你的Screen会话上,并且你的终端不会被Detach。这样你就可以和朋友共享同一个会话 了,如果你们当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到 这个会话的不同窗口中去,那还是可以分别进行不同的操作的。
6.2 会话锁定与解锁
Screen允许使用快捷键C-a s锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。快捷键C-a q可以解锁一个会话。
也可以使用C-a x锁定会话,不同的是这样锁定之后,会话会被Screen所属用户的密码保护,需要输入密码才能继续访问这个会话。
6.3 发送命令到screen会话
在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利。关于Screen在脚本中的应用超出了入门的范围,这里只看一个例子,体会一下在会话之外对Screen的操作:
[root@TS-DEV ~]# screen -S sandy -X screen ping www.baidu.com
这个命令在一个叫做sandy的screen会话中创建一个新窗口,并在其中运行ping命令。
6.4 屏幕分割
现在显示器那么大,将一个屏幕分割成不同区域显示不同的Screen窗口显然是个很酷的事情。可以使用快捷键C-a S将显示器水平分割,Screen 4.00.03版本以后,也支持垂直分屏,快捷键是C-a |。分屏以后,可以使用C-a <tab>在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。
可以用C-a X快捷键关闭当前焦点所在的屏幕区块,也可以用C-a Q关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它。
6.5 C/P模式和操作
screen的另一个很强大的功能就是可以在不同窗口之间进行复制粘贴了。使用快捷键C-a <Esc>或者C-a [可以进入copy/paste模式,这个模式下可以像在vi中一样移动光标,并可以使用空格键设置标记。其实在这个模式下有很多类似vi的操作,譬如使 用/进行搜索,使用y快速标记一行,使用w快速标记一个单词等。关于C/P模式下的高级操作,其文档的这一部分有比较详细的说明。
一般情况下,可以移动光标到指定位置,按下空格设置一个开头标记,然后移动光标到结尾位置,按下空格设置第二个标记,同时会将两个标记之间的部分储 存在copy/paste buffer中,并退出copy/paste模式。在正常模式下,可以使用快捷键C-a ]将储存在buffer中的内容粘贴到当前窗口。
6.6 更多screen功能
同大多数UNIX程序一样,GNU Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc 和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权 限控制等等。如果你愿意的话,也可以自己指定screen配置文件。
以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文 件内容请参考screen的man页。