我正在尝试在脚本中使用 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)
也许有一种方法可以通过处理进程(使用fg,bg...),但我仍然没有弄清楚。
类似问题:
[1]让 tmux 阻塞,直到程序完成
[2] Bash - 在 tmux 中执行阻塞脚本
[3]如何隐藏 tmux 窗格
[4]如何等待第一个命令完成?
您可以使用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无法自动等待窗格或窗口退出、窗格中的静音等内容,但我希望看到在某个时候实现这一点。
| 归档时间: |
|
| 查看次数: |
11579 次 |
| 最近记录: |