传说中的 screen

文章

基本语法

Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。

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作业。

nohup vs screen

如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。

nohup <command> [argument…] &

//我最常用nohup的地方就是开启 goagent 代理
$ !nohup //执行最近执行的一条 nohup 命令,我最近的一条通常都是 nohup python ~/programs/goagent/local/proxy.py &

虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。

快捷键

C-a ?   显示所有键绑定信息 //貌似我的 ubuntu 这条没反应啊
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 [   进入拷贝/回滚模式

一个小例子

你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序

$ >screen.test
$ screen vi screen.test //作为测试,随便敲点东西,然后键入 C-a d
  [detached from 4804.pts-0.malei-Inspiron-N4010]
$ screen -ls
  There is a screen on:
    4804.pts-0.malei-Inspiron-N4010 (2013年03月06日 17时52分03秒) (Detached)
  1 Socket in /var/run/screen/S-malei.

$ screen -r 4804.pts-0.malei-Inspiron-N4010 //4804 [tab] 补全即可(进入我们断开的绘画继续工作) C-a d
  [detached from 4804.pts-0.malei-Inspiron-N4010]
$ screen -ls
  There is a screen on:
    4804.pts-0.malei-Inspiron-N4010 (2013年03月06日 17时52分04秒) (Detached)
  1 Socket in /var/run/screen/S-malei.

//发现时间,暂停了 =。= 有木有  =========> 靠,颜色高亮好混乱啊

如果screen的进程打开的比较多,为了方便识别不同的screen,可以加上 -S 参数,给每个screen不同的 名称 比如 screen -S test ,进程里就会看到这个screen被标为 test.pts-0.host ,而不是进程ID了。

Reference

« xrandr 命令小用 wine 你懂的 »

留下一句吧