文章
基本语法
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了。