终端下高效工作利器Gnu Screen

Posted by fishcried on August 22, 2014

1. screen是什么

Gnu Screen是个终端的多路复用器。可以在一个终端内执行任意多个应用程序。可能没有理解,简单来说screen解决了终端下两个最尴尬的困境。也就是screen的两大特性:

  1. 终端下工作的人都会面临这需要打开6,7个终端,或者表且多个标签页,每个里面运行一个应用或者完整某类功能。然后在他们之间不断的寻找切换,屏幕就那么大,会分散很多注意力。screen只需要一个终端就可以解决。
  2. 一般远程登录服务器,重复上面的场景,啪,网断了……慢呼吸一会,重新登录,然后祈祷网络别再断。有了screen就不用担心了,即使断网,一切都可以恢复。

其实看到以上特性,screen就非差的值得使用了。但是screen还有很多特性.

  • 支持分屏.terminator支持分屏,vim + ConqueTerm也能做到,但是他们在远程登录中缺陷一下子出来了,新创建的窗口依然需要先ssh.也就是说你屏幕分成四块,就需要登录四次.硬伤.screen只需要登录一次.
  • 日志记录.终端下的操作均可记录
  • 监控并通知. 也就是说你在一个窗口运行的工作一段时间后结束了.而且在忙着其他的事情,screen能够自动的提醒你.
  • 高度定制且可用于编程.

2. 基本操作

screen中有个session的概念,screen可以创建多个session,session中可以创建多个windowwindow就像一个真实的终端,其内可随意运行命令。 每个session可以detach/reattach.当detach一个session后,sessionwindow内命令照常执行,不受影响。

2.1 session

创建session

screen -S name 

创建session最好通过-S附带名字,这是一个好习惯,可以reattach的时候直接通过命令。便于记忆。

Detach session 当你想切换其他session时,需要detach掉当前sessionC + a + d,该快捷键就可以搞定。

Retach session 当你想reattach session

screen -r name

查看存在那些session

screen -ls

退出session 如果当前window是session的最后一个session,键入exit就可以退出。 如果存在多个windows,C +a + :,然后键入quit就可以退出

总结

参数或快捷键 含义
screen -d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
screen -list|-ls 列出现有screen会话,格式为pid.tty.host
screen -d -m 启动一个开始就处于断开模式的会话
screen -r sessionowner/ [pid.tty.host] 新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
screen -S sessionname screen会话时为会话指定一个名字
screen -wipe [match] 同-list,但删掉那些无法连接的会话
Ctrl-a d 暂时断开screen会话

2.2 windows操作

窗口可以创建,切换,命名标题,切换,退出等。具体不再详细解说,简单看一个表,都是快捷键.

快捷键 含义
C-a ? 显示所有键绑定信息
C-a w 显示所有窗口列表
C-a C-a 换到之前显示的窗口
C-a c 创建一个新的运行shell的窗口并切换到该窗口
C-a n 切换到下一个窗口
C-a p 切换到前一个窗口(与C-a n相对)
C-a a 发送 C-a到当前窗口
C-a A 修改窗口标题
C-a k 杀掉当前窗口
C-a [ 进入拷贝/回滚模式
C-a ‘ 选择窗口
C-a “ 选择窗口,通过列表的形式
C-a k 销毁当前窗口

2.3 复制与粘贴模式

screen有两种特殊模式,复制与粘贴。进入粘贴模式后,光标的可以回滚,移动操作同vim(这真的是太便利了).如果想选定文本,只需要按space,然后移动,结束后按space.进入粘贴模式后,选择的文本就会自动按贴过来。

快捷键 含义
C-a [ 键入复制模式
H 光标移动到左上角
L 光标移动到左下角
第一次space 复制开始
第二次space 复制结束
C-a ] 进入粘贴模式

3. 如何高效的使用screen

0. 没有screen绝不工作! 无论你是本地登录,还是远程登录,首先都应该建立一个session后,然后在session内工作。这样出现意外了,一切都可以恢复。 而且如果你是远程工作,那么退出时只要detach就好,下次登录直接reattach,多美妙啊。

1. 多sessions,还是多windows? 即使你需要非常多的终端,执行大量的应用,都建议你只使用一个session。然后通过多windows来实现。因为windows的相互切换非常快速,而session见的切换相对来说繁杂。

2. 好名字,他好你也好 每个windows最好都各自命名,然后通过C - a - "来选择切换,当然了,大部分时间都使用C - a - a来临近切换。切换最理想的状态是自然,想切换的时候直接触发手指动作,而不用去思考,这样能减少注意力分散.最常见的是两个窗口之间的切换,因为局部原则,记住C-a-a.而且切换最好通过名字,前提是对每个窗口命好名字.

3. 分屏 如果你常用命令行工作,肯定已经想急迫的知道screen是否支持分屏,因为这太重要了。screen有,不过screen叫多region。

  • C-a S水平分屏
  • C-a |垂直分屏
  • C-a tab切换
  • C-a X退出该region
  • C-a :resize max region最大化
  • C-a :resize min region最小化
  • C-a :resize = region恢复

分屏后,需要在该region创建window,才可以使用

关于分屏需要注意,如果你detach该session,然后reattach回来,分屏布局就会丢失,但是窗口任务还是存在的。如果锁定然后解锁,依然会遇到该问题。这也是为什么不建议多session总切换的原因之一。

4. 复制模式,不一定非得要复制 screen没有滚动条,如果需回看,可以进入复制模式。然后就像vim一样操作。这比鼠标方便多了!

5. 历史不容篡改 screen有日志记录功能。会多所有操作都进行记录。C-a h.

6. 老大,有任务执行结束了 有两个窗口,当你处于窗口2时,你想知道窗口1是否活跃,或这是否不活跃。那么可以交给监控小秘书。

  • C-a _ 如果该窗口超过30秒没有输出,那么进行通知.例如该窗口执行下载,编译等任务。而且你在做其他的事情,小秘书会即使通知你。
  • C-a M 如果该窗口有输出,那么进行通知.这个常常用于irc聊天,秘书提醒有人发消息了

7. screen编程,执行并行任务 screen还可以用于shell脚本编程,对任务进行并行控制。但是目前我还没有相关经验。只能留个todo。具体可以参考devstack的安装脚本。

8. screen还能做什么 screen还能做的任务很多,比如锁屏,会话共享,支持自定制等。但是我的目的是使用screen来提供工作效率,所以不做介绍了。自行挖掘吧.

4. screen真的能提高工作效率?

回到标题,screen是否能够促进工作效率,毕竟用这个的东西的国内好像很少,搜索一下就可以知道?

前提是你真的大部分时间都在终端下工作,而且也习惯命令行,那么看到最开始的session就会感叹,这东西绝对是你需要的。如果还有所怀疑,请真正的试用两三天。然后根据感受来判定是否继续下去…

变更记录

Why Who When
创建 fishcired 2014-08-13
添加内容 fishcired 2014-08-22
调整语句 fishcired 2014-08-23
修正拼写错误 fishcired 2014-08-23