tmux 的远程控制功能给我留下了深刻的印象:
tmux new-window -t p12346 'echo foo;sleep 10'
Run Code Online (Sandbox Code Playgroud)
这会在名为 p12346 的会话中创建一个新窗口,并且不会在屏幕上打印任何内容。太棒了。但是我怎么能告诉上面的命令等到睡眠完成后再返回呢?即我希望这样做同样但需要 10 秒来执行:
time tmux new-window -t p12346 'echo foo;sleep 10'
Run Code Online (Sandbox Code Playgroud)
背景
如果这是可行的,那么它可能会成为 GNU Parallel 的一个功能:当前运行的作业可以作为每个窗口通过 访问tmux
,因此您可以实时跟踪每个作业的进度。
所以tmux
不会在前台运行:用户需要附加到它。
tmux 1.8 引入了wait-for
可以帮助您完成所需的命令:
time tmux new-window -t p12346 'echo foo;sleep 10;tmux wait-for -S p12346-neww-done' \; \
wait-for p12346-neww-done
Run Code Online (Sandbox Code Playgroud)
“通道”名称(p12346-neww-done
在上面的示例中)可以是任何您喜欢的名称(只要它在两个地方都相同;如果您预计多个潜在的同时调用,那么您可能还希望为每个调用使用一个唯一值)。重要的部分是你在new-window
命令之后“等待”信号(作为同一tmux命令的一部分,因此转义分号:tmux需要处理它,而不是 shell)并将信号作为最后一步发送窗口的命令。
如果您需要对以丑陋或不方便的方式中止的命令序列更加健壮,那么您可以尝试使用 shell 陷阱来发送信号(为了可读性(?)重新排列了一下):
time \
tmux new-window -t p12346 '
trap "tmux wait-for -S p12346-neww-done" 0
echo foo
sleep 10
' \; wait-for p12346-neww-done
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4387 次 |
最近记录: |