.. _screen: ========================== 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 x`` ( ``x`` 就是新窗口编号数字) .. _screen_dm: ``screen`` 后台( ``detach`` )运行多个任务 ============================================= screen 的参数 ``-dm`` 非常时候 **脱机** 运行大量程序,我在使用 :ref:`awk` 转换 ``yaml`` 文件成为一行内容时遇到一个困难: 需要同时运行上百个转换脚本(处理上百个列表文件,每个列表文件中内容为1w行yaml文件名)。 最初我使用 ``nohup`` 来运行上百个转换脚本(同一个脚本,但是传递不同的需要处理的列表文件)。我发现有一个奇怪的 **踩踏** 问题: 只有第一个nohup运行的转换是正常的,其他转换的换行符替换成 \n 都失败了。我怀疑是因为我在同一个shell中执行并发导致,同一个脚本调用nohup,全局变量可能对于每个启动 :ref:`nohup` 的脚本实际上是同一个变量: 改为使用 ``screen -dm bash -c "script.sh xx"`` 来避免这个问题,果然并行启动100+个screen来运行程序都没有问题。 参考 ====== - `How to execute a command in screen and detach? `_