我在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
然后我可以看到此会话是否完成运行。
但是,有没有办法可以检查所有屏幕会话的进度而无需重新连接到每个会话?
(因为你用“tmux”标记了这个问题,我假设你没有使用Tmux代替Screen的答案。)
Tmux有一个活动监控的概念:如果窗口发生了变化,将通知用户。 “活动”是窗口的任何视觉变化,无论是打印出来的东西还是程序完成(并返回到shell,然后他们会打印出它的提示,从而触发活动监视器。)如果你的进程已经表现得那样,那么你可以跳过下面列表中的第2步,并简化第4步。
如果您有输出大量内容的进程,并且您不想将该输出重定向到文件中,则必须采用静默监视。在该模式下,Tmux将监视在最后N秒内没有输出的窗口。我建议反对这种方法,因为它需要比活动监测更多的工作。
所以这就是你能做的:
.tmux.conf
,为所有窗口启用活动监视:
set-window-option -g monitor-activity on
这应该涵盖大多数用例。monitor-silence
。你可以在全球范围内进行设置,但我认为你没有足够的幸运能够达到一个适合所有事情的超时;因此,这里我提出了一个应该在每个窗口中单独运行的命令(通过按前缀,默认为Ctrl-a,然后键入它):
set-window-option monitor-silence N
这里的N是Tmux应该认为窗口静音的秒数。tmux list-windows -a \
-F "#{window_activity_flag}#{window_silence_flag} #S:#W" \
| egrep '^(10|01)'
这里发生了什么?
tmux list-windows
显然列出了窗户;
-a
的意思是“列出所有会话的所有窗口”;
-F
指定输出格式。在这里,我们输出两个标志(可以是0
或1
),然后是空格,然后是冒号分隔的会话和窗口名称;
最后,我们grep
用于window_activity_flag
或window_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
前五个窗口有活动通知,最后一个窗口有静音通知。