使tmux阻塞,直到程序完成


8

tmux的远程控制功能给我留下了深刻的印象:

tmux new-window -t p12346 'echo foo;sleep 10' 

这将在名为p12346的会话中创建一个新窗口,并且不会在屏幕上打印任何内容。这太棒了。但是,如何告诉上面的命令等到睡眠完成才返回?即我希望这样做,但要花10秒才能执行:

time tmux new-window -t p12346 'echo foo;sleep 10' 

背景

如果可行,那么它可能成为GNU Parallel的功能:当前正在运行的作业可以通过访问它们的每个窗口tmux,因此您可以实时跟踪每个作业的进度。

因此tmux不会在前台运行:用户将需要附加到它。

Answers:


8

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

“通道”名称(p12346-neww-done在上面的示例中)可以是您喜欢的任何名称(只要在两个地方都相同);如果您预期多个潜在的同时调用,那么您可能还希望为每个调用使用唯一值)。重要的是您要在new-window命令后“等待”信号(作为同一tmux命令的一部分,因此是转义的分号:tmux需要处理它,而不是外壳程序),并在发送信号的最后一步发送信号窗口的命令。

如果您需要更强壮的功能来防止以丑陋或不便的方式中止命令序列,那么您可以尝试使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.