【问题标题】:Run command in new background tmux window and wait for process to finish在新的后台 tmux 窗口中运行命令并等待进程完成
【发布时间】:2020-02-24 20:51:19
【问题描述】:

我正在尝试在脚本中使用 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!"

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

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

编辑

感谢 Nicholas Marriott 指出在创建新窗口时存在 -d 选项以避免自动切换到它。现在唯一的问题是阻塞主脚本直到命令结束。

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

tmux new-window -d 'ping -c 5 8.8.8.8; tmux wait -S ping' &
tmux wait $!

也许有办法通过玩进程(使用fg,bg...),但我还没有弄明白。

类似问题:
[1] Make tmux block until programs complete
[2]Bash - executing blocking scripts in tmux
[3]How do you hide a tmux pane
[4]how to wait for first command to finish?

【问题讨论】:

  • 有什么原因不能使用运行脚本的同一个 tmux 窗口?
  • 基本上,我需要尽可能少的输出数据,命令有很多,也可以与之交互。所以不可能将标准输出重定向到一个文件并观看它,因为我无法与之交互。

标签: bash tmux


【解决方案1】:

你可以使用wait-for,但你需要给它一个通道,并在你的过程完成后向该通道发出信号,例如:

tmux neww -d 'ping blah; tmux wait -S ping'
tmux wait ping
echo done

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

wait-for 不能自动等待窗格或窗口退出、窗格中的静默等内容,但我希望在某个时候实现。

【讨论】:

  • 感谢您指出new-window-d 选项,我在浏览该人时什至没有看到它。我相应地编辑了我的问题,并为脚本阻止部分添加了更多想法。
  • 我不明白,你接听了-d,但没有阅读我的其余答案?你从哪里得到wait $!tmux wait ping 的全部意义在于阻止,直到您使用 tmux wait -S ping 发出信号...
  • 糟糕,我很抱歉,我认为你的命令不起作用,但我犯了一个大错字并最终搜索了其他解决方案(参见我发布的第 4 个链接)。最后,您的解决方案正是我所需要的,非常感谢!
  • 我注意到如果出现问题并且“tmux wait -S ping”没有生效,则无法使用正常的 Ctrl+C 退出“tmux wait ping”。有没有办法从终端中断“tmux wait”?
猜你喜欢
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2012-10-16
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多