如何在不重新加入会话的情况下检查屏幕会话的进度?

时间:2016-04-22 18:11:53

标签: bash shell command-line tmux gnu-screen

我在Unix上运行屏幕会话。打开并运行几个屏幕会话后,我想检查每个屏幕会话的进度,以查看是否有任何会话完成运行。

在命令行中,如果我输入:

.map {|i| i.to_s}

我可以看到分离的屏幕会话列表,例如

$screen -ls

如果我想检查4个会话中的任何一个是否完成运行,我可以重新连接一个会话以检查进度:

There are screens on:
    4683.pts-0.xxxx (Detached)
    4869.pts-0.xxxx (Detached)
    4848.pts-0.xxxx (Detached)
    4890.pts-0.xxxx (Detached)
4 Sockets in /var/run/screen/S-xyzxyz.

然后我可以看到这个会话是否完成了运行。

但是,有没有什么方法可以检查所有屏幕会话的进度而无需重新连接到每个会话?

1 个答案:

答案 0 :(得分:1)

(因为您已使用&#34; tmux&#34;标记了问题,我将假设您使用Tmux而不是屏幕的答案可以。)< / p>

Tmux有一个活动监控的概念:如果窗口发生了变化,将通知用户。 &#34;活动&#34;是窗口的任何视觉变化,无论是打印出来的东西还是只是程序完成(并返回到shell,然后将打印出它的提示,从而触发活动监视器。)如果您的进程已经表现得那样,您可以跳过步骤在下面的列表中有2个,并且还简化了步骤4.

如果您的流程输出了大量内容,并且您不想将该输出重定向到文件中,那么您将不得不求助于静音监控。在该模式下,Tmux将监视在最后N秒内没有输出的窗口。我建议反对这种方法,因为它需要比活动监测更多的工作。

所以,你可以做什么:

  1. 通过将以下内容放入.tmux.conf

    ,为所有窗口启用活动监控
    set-window-option -g monitor-activity on
    

    这应该涵盖大多数用例。

  2. 如果您想监控不活动状态,则必须为每个窗口设置monitor-silence。你可以在全球范围内进行设置,但我认为你没有足够的幸运能有一次适合所有事情的超时;因此,在这里我提出了一个应该在每个窗口中单独运行的命令(通过按前缀,默认为 Ctrl - a ,然后键入它):

    set-window-option monitor-silence N
    

    N这里是Tmux应该认为窗口静音的秒数。

  3. 现在,您可以启动所有流程并从会话中分离。

    注意:活动和静音监控只会通知您不看的窗口;因此,如果您希望我们在下一步中生成的报告完成,您应该从所有会话中分离。

  4. 最后,您可以运行以下命令来查找哪些会话有活动或静音通知:

    tmux list-windows -a \
        -F "#{window_activity_flag}#{window_silence_flag} #S:#W" \
    | egrep '^(10|01)'
    

    这里发生了什么?

    1. tmux list-windows明显列出了窗口;
    2. -a表示&#34;列出所有会话的所有窗口&#34;;
    3. -F指定输出格式。在这里,我们输出两个标志(可以是01),然后是空格,然后是冒号分隔的会话和窗口名称;
    4. 最后,对于grepwindow_activity_flag为1的行,我们window_silence_flag,即对于Tmux生成活动或静默报告的窗口。 (您还可以设置活动和静音监视器,然后设置11组合的grep,但这会使设置更加脆弱,所以我将其留作读者的练习:)
    5. 反斜杠仅用于格式化 - 它们可以转义换行符。您可以省略它们并将所有代码用作oneliner。
    6. 输出如下:

      10 project:vim
      10 project:zsh
      10 rfcs:WebDAV
      10 rfcs:WebDAV requirements
      10 rfcs:Versioning WebDAV
      01 test:zsh
      

      前五个窗口有活动通知,最后一个窗口有静音通知。