如何在不重新连接到会话的情况下检查屏幕会话的进度?
How to check progress of a screen session without reattaching into the session?
我在 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 有一个 activity 监控的概念:如果 window 中发生更改,用户将收到通知。 "Activity" 是对 window 的任何视觉更改,无论是打印出来的东西还是只是程序完成(并返回到 shell,后者将打印出其提示,从而触发 activity monitor.) 如果你的流程已经这样了,你可以跳过下面列表中的第 2 步,同时简化第 4 步。
如果您有输出大量内容的进程并且您不想将该输出重定向到文件中,则您将不得不求助于静默监控。在那种模式下,Tmux 将监视 windows 在最后 N 秒内没有发生输出的地方。我反对这种方法,因为它需要比 activity 监控更多的工作。
因此,您可以执行以下操作:
通过将以下内容放入 .tmux.conf
:
来为所有 windows 启用 activity 监控
set-window-option -g monitor-activity on
这应该涵盖大部分用例。
如果要监视 inactivity,则必须为每个 window 设置 monitor-silence
。您可以全局设置它,但我认为您不会幸运地拥有一个适合所有情况的超时;因此,在这里我提出了一个命令,应该在每个 window 中分别是 运行(通过按前缀,即 Ctrl-a 默认,然后输入它):
set-window-option monitor-silence N
N 这里是 Tmux 应该认为 window 静默的秒数。
现在您可以启动所有进程并从会话中分离。
注意:activity和静音监控只会通知您windows您不看;因此,如果您希望我们将在下一步中生成的报告完整,您应该脱离所有会话。
最后,您可以运行以下内容来找出哪些会话有activity或静音通知:
tmux list-windows -a \
-F "#{window_activity_flag}#{window_silence_flag} #S:#W" \
| egrep '^(10|01)'
这是怎么回事?
tmux list-windows
列出 windows,显然;
-a
表示"list all windows of all sessions";
-F
指定输出格式。在这里,我们输出两个标志(可以是 0
或 1
),然后是 space,然后是会话和 window 由冒号分隔的名称;
- 最后,我们
grep
用于 window_activity_flag
或 window_silence_flag
为 1 的行,即 Tmux 生成 activity 或沉默报告的 windows . (您也可以同时设置 activity 和静音监视器,然后 grep for 11
组合,但这会使设置更加脆弱,所以我将其作为 reader :)
- 反斜杠只是为了格式化——它们正在转义换行符。您可以省略它们并将所有代码用作单行代码。
输出如下所示:
10 project:vim
10 project:zsh
10 rfcs:WebDAV
10 rfcs:WebDAV requirements
10 rfcs:Versioning WebDAV
01 test:zsh
前五个windows有activity通知,最后一个有静音通知。
我在 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 有一个 activity 监控的概念:如果 window 中发生更改,用户将收到通知。 "Activity" 是对 window 的任何视觉更改,无论是打印出来的东西还是只是程序完成(并返回到 shell,后者将打印出其提示,从而触发 activity monitor.) 如果你的流程已经这样了,你可以跳过下面列表中的第 2 步,同时简化第 4 步。
如果您有输出大量内容的进程并且您不想将该输出重定向到文件中,则您将不得不求助于静默监控。在那种模式下,Tmux 将监视 windows 在最后 N 秒内没有发生输出的地方。我反对这种方法,因为它需要比 activity 监控更多的工作。
因此,您可以执行以下操作:
通过将以下内容放入
来为所有 windows 启用 activity 监控.tmux.conf
:set-window-option -g monitor-activity on
这应该涵盖大部分用例。
如果要监视 inactivity,则必须为每个 window 设置
monitor-silence
。您可以全局设置它,但我认为您不会幸运地拥有一个适合所有情况的超时;因此,在这里我提出了一个命令,应该在每个 window 中分别是 运行(通过按前缀,即 Ctrl-a 默认,然后输入它):set-window-option monitor-silence N
N 这里是 Tmux 应该认为 window 静默的秒数。
现在您可以启动所有进程并从会话中分离。
注意:activity和静音监控只会通知您windows您不看;因此,如果您希望我们将在下一步中生成的报告完整,您应该脱离所有会话。
最后,您可以运行以下内容来找出哪些会话有activity或静音通知:
tmux list-windows -a \ -F "#{window_activity_flag}#{window_silence_flag} #S:#W" \ | egrep '^(10|01)'
这是怎么回事?
tmux list-windows
列出 windows,显然;-a
表示"list all windows of all sessions";-F
指定输出格式。在这里,我们输出两个标志(可以是0
或1
),然后是 space,然后是会话和 window 由冒号分隔的名称;- 最后,我们
grep
用于window_activity_flag
或window_silence_flag
为 1 的行,即 Tmux 生成 activity 或沉默报告的 windows . (您也可以同时设置 activity 和静音监视器,然后 grep for11
组合,但这会使设置更加脆弱,所以我将其作为 reader :) - 反斜杠只是为了格式化——它们正在转义换行符。您可以省略它们并将所有代码用作单行代码。
输出如下所示:
10 project:vim 10 project:zsh 10 rfcs:WebDAV 10 rfcs:WebDAV requirements 10 rfcs:Versioning WebDAV 01 test:zsh
前五个windows有activity通知,最后一个有静音通知。