screen终端多路复用管理器

GNU Screen是一个终端多路复用管理器,用于同时并发的多路虚拟控制台,允许用在一个登录会话中访问分隔的会话,或者断开并重连一个终端的会话。这样,用户远程登录到服务器,即使关闭终端,也可以再次登录服务器访问上次断开的终端。

screen窗口

Ctrl-a ,然后在当前窗口中按双引号键( " ),就可以看到会话中可用窗口的列表

终止当前窗口的方法是,在窗口的 shell 提示上输入 exit ,或者按键盘快捷键 Ctrl-a ,然后按 k (小写的字母 K ,代表 “kill”)。如果使用后一种方法,那么在窗口底部会出现一个警告,要求您确认要杀死此窗口。按 y (小写的字母 Y,代表 “yes”)确认,或按 n (小写的字母 N,代表 “no”)拒绝。

  • 指定窗口名称

指定窗口名称的方法:激活窗口,按 Ctrl-a A (大写的字母 A ,代表 “Annotate”),根据需要按 Backspace 删除现有的名称,然后在提示上输入一个有意义的名称

  • 修改窗口编号

由于screen支持 0~9 的10个快捷窗口切换,所以窗口编号非常重要。如果有部分窗口关闭,空出了 0~9 之间的编号,则可以修改其他窗口来填补这个编号。

修改方法:激活窗口,按 Ctrl-a ,然后输入 :number xx 就是新窗口编号数字)

screen 后台( detach )运行多个任务

screen 的参数 -dm 非常时候 脱机 运行大量程序,我在使用 awk 转换 yaml 文件成为一行内容时遇到一个困难: 需要同时运行上百个转换脚本(处理上百个列表文件,每个列表文件中内容为1w行yaml文件名)。

最初我使用 nohup 来运行上百个转换脚本(同一个脚本,但是传递不同的需要处理的列表文件)。我发现有一个奇怪的 踩踏 问题: 只有第一个nohup运行的转换是正常的,其他转换的换行符替换成 n 都失败了。我怀疑是因为我在同一个shell中执行并发导致,同一个脚本调用nohup,全局变量可能对于每个启动 nohup 的脚本实际上是同一个变量:

改为使用 screen -dm bash -c "script.sh xx" 来避免这个问题,果然并行启动100+个screen来运行程序都没有问题。

参考