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

问题描述 投票:0回答:1

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

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

$screen -ls

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

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.

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

$screen -r 4683.pts-0.xxxx

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

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

bash shell command-line tmux gnu-screen
1个回答
1
投票

(因为你用“tmux”标记了这个问题,我假设你没有使用Tmux代替Screen的答案。)

Tmux有一个活动监控的概念:如果窗口发生了变化,将通知用户。 “活动”是窗口的任何视觉变化,无论是打印出来的东西还是程序完成(并返回到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)' 这里发生了什么? tmux list-windows显然列出了窗户; -a的意思是“列出所有会话的所有窗口”; -F指定输出格式。在这里,我们输出两个标志(可以是01),然后是空格,然后是冒号分隔的会话和窗口名称; 最后,我们grep用于window_activity_flagwindow_silence_flag为1的行,即用于Tmux生成活动或沉默报告的窗口。 (您也可以设置活动和静音监视器,然后grep for 11组合,但这会使设置更加脆弱,所以我将其留作读者的练习:) 反斜杠只是用于格式化 - 它们是转义换行符。您可以省略它们并将所有代码用作oneliner。 输出如下所示: 10 project:vim 10 project:zsh 10 rfcs:WebDAV 10 rfcs:WebDAV requirements 10 rfcs:Versioning WebDAV 01 test:zsh 前五个窗口有活动通知,最后一个窗口有静音通知。
© www.soinside.com 2019 - 2024. All rights reserved.