スクリプトでtmuxを使用しようとしています。そのため、現在のスクリプト自体をブロックするまで、新しい非表示のペインで時間がかかるコマンド(たとえば、「ping -c 58.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コマンドは実際にはこのような意味を持たないことを私は知っていますが、これは単に説明するためのものです。
バックグラウンドでコマンドを送信するか、別のペインでプロセスが終了するまで待つために、さまざまな解決策を検討しましたが、両方を正しく行う方法がまだ見つかりません。
編集
-d
新しいウィンドウを作成するときに自動的に切り替わらないようにするオプションが存在することを指摘してくれたNicholasMarriottに感謝します。現在、唯一の問題は、コマンドが終了するまでメインスクリプトをブロックすることです。
うまくいくことを期待して次のことを試しましたが、うまくいきません(スクリプトが再開されません)。
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
ペインやウィンドウが終了する、ペインが無音になるなどを自動的に待つことはできませんが、いつか実装されることを望んでいます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加