[英]Run command in new background tmux window and wait for process to finish
我正在嘗試在腳本中使用 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 指出在創建新的 window 時存在-d
選項以避免自動切換到它。 現在唯一的問題是在命令結束之前阻止主腳本。
我嘗試了以下方法,希望它能起作用,但它也不起作用(腳本沒有恢復)。
tmux new-window -d 'ping -c 5 8.8.8.8; tmux wait -S ping' &
tmux wait $!
也許有一種方法可以玩進程(使用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
如果您認為您可能會並行多次運行該腳本,我建議使用mktemp
或類似方法創建頻道名稱(並在wait-for
返回時刪除該文件)。
wait-for
不能自動等待窗格或窗口退出、窗格中的靜音等內容,但我希望看到在某個時候實現。
僅當您已經在 tmux session 中時,其他答案才有效。 但如果你不在它之外,你必須使用這樣的東西:
tmux new-session -d 'vi /etc/passwd' \; split-window -d 'vi /etc/group' \; attach
如果你想在腳本中調用它,你應該檢查是否設置了“$TMUX”。 (或者只是取消設置以強制嵌套 tmux 窗口)。
#!/bin/sh
export com1="vi /etc/passwd"
export com2="vi /etc/group"
if [ -z $TMUX ]
then
export doNewSession="new-session -d 'exit 0'"
else
export doNewSession=""
fi
tmux $doNewSession \; split-window -d $com1 \; split-window -d $com2 \; attach;
[ -z $TMUX ] && exit 0
我的解決方案是命名為 pipe,然后使用read
等待輸入:
#!/bin/sh
rm -f /wait
mkfifo /wait
tmux new-window -d '/bin/sh -c "ping -c 5 8.8.8.8; echo . > /wait"'
read -t 10 WAIT <>/wait
[ -z "$WAIT" ] &&
echo 'The operation failed to complete within 10 seconds.' ||
echo 'Operation completed successfully.'
我喜歡這種方法,因為您可以設置超時,如果需要,您可以使用其他tmux
控件進一步擴展它,以終止正在進行的進程(如果它沒有按您想要的方式結束)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.