簡體   English   中英

在新的后台運行命令 tmux window 並等待進程完成

[英]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 $!

也許有一種方法可以玩進程(使用fgbg ...),但我仍然沒有弄清楚。

類似問題:
[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM