在新的后台 tmux 窗口中运行命令并等待进程完成

2_5*_*5am 6 bash tmux

我正在尝试在脚本中使用 tmux,以便它在新的隐藏窗格中运行一个需要一些时间的命令(例如“ping -c 5 8.8.8.8”),同时阻止当前脚本本身,直到ping 结束。

我所说的“隐藏窗格”是指在新窗格中运行命令,该命令将在后台发送,并且仍然可以通过切换窗格进行访问,以便监视和/或与其交互(不一定是 ping)。
(参见编辑)

这是一些伪 bash 代码,可以更清楚地显示我想要做什么:

echo "Waiting for ping to finish..."
echo "Ctrl-b + p to switch pane and see running process"

tmux new-window -d 'ping -c 5 8.8.8.8' # run command in new "background" window
tmux wait-for                          # display "Done!" only when ping command has finished

echo "Done!"
Run Code Online (Sandbox Code Playgroud)

我知道这里的 tmux 命令实际上没有任何意义,但这只是为了说明。

我已经研究了不同的解决方案,以便在后台发送命令,或者等到另一个窗格中的进程完成,但我仍然没有找到正确执行这两种操作的方法。

编辑

感谢尼古拉斯·马里奥特指出-d在创建新窗口时存在该选项以避免自动切换到它。现在唯一的问题是阻止主脚本直到命令结束。

我尝试了以下操作,希望它能起作用,但它也不起作用(脚本不会恢复)。

tmux new-window -d 'ping -c 5 8.8.8.8; tmux wait -S ping' &
tmux wait $!
Run Code Online (Sandbox Code Playgroud)

也许有一种方法可以通过处理进程(使用fgbg...),但我仍然没有弄清楚。

类似问题:
[1]让 tmux 阻塞,直到程序完成
[2] Bash - 在 tmux 中执行阻塞脚本
[3]如何隐藏 tmux 窗格
[4]如何等待第一个命令完成?

Nic*_*ott 6

您可以使用wait-for,但需要为其提供一个通道,并在流程完成时向该通道发出信号,例如:

tmux neww -d 'ping blah; tmux wait -S ping'
tmux wait ping
echo done
Run Code Online (Sandbox Code Playgroud)

如果您认为可以并行运行脚本多次,我建议使用mktemp或类似的名称创建通道名称(并在返回时删除文件wait-for)。

wait-for无法自动等待窗格或窗口退出、窗格中的静音等内容,但我希望看到在某个时候实现这一点。

  • 我注意到,如果出现问题并且“tmux wait -S ping”不起作用,则无法使用普通的 Ctrl+C 退出“tmux wait ping”。有没有办法从终端中断“tmux wait”? (2认同)