使 tmux 阻塞直到程序完成

Ole*_*nge 9 tmux

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不会在前台运行:用户需要附加到它。

Chr*_*sen 9

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)