プログラムが完了するまでtmuxをブロックする


8

tmuxのリモートコントロール機能に感心しました。

tmux new-window -t p12346 'echo foo;sleep 10' 

これにより、p12346という名前のセッションに新しいウィンドウが作成され、画面には何も印刷されません。それは素晴らしい。しかし、どのようにして上記のコマンドに、スリープが終了するまで待機してから戻るように指示できますか?つまり、これも同じようにしたいのですが、実行に10秒かかります。

time tmux new-window -t p12346 'echo foo;sleep 10' 

バックグラウンド

これが実行可能な場合は、GNU Parallelの機能になる可能性があります。現在実行中のジョブには、それぞれのウィンドウからにアクセスtmuxできるため、各ジョブの進行状況をリアルタイムで追跡できます。

したがってtmux、フォアグラウンドでは実行されません。ユーザーはそれに接続する必要があります。

回答:


8

tmux 1.8には、wait-for必要な操作を実行できるコマンドが導入されています。

time tmux new-window -t p12346 'echo foo;sleep 10;tmux wait-for -S p12346-neww-done' \; \
          wait-for p12346-neww-done

「チャネル」名(p12346-neww-done上記の例)は、任意の名前にすることができます(両方の場所で同じである限り)。複数の同時呼び出しの可能性があることが予想される場合は、各呼び出しに一意の値を使用することもできます。 )。重要な部分は、new-windowコマンドの後に信号を「待つ」(同じtmuxコマンドの一部として、エスケープされたセミコロン:tmuxはシェルではなく、それを処理する必要がある)ことと、最後のステップとして信号を送信することです。ウィンドウのコマンド。

醜いまたは不便な方法で中止するコマンドシーケンスに対してもう少し堅牢にする必要がある場合は、シェルトラップを使用して信号を送信してみてください(読みやすくするためにビットを再配置します(?)):

time \
tmux new-window -t p12346 '
       trap "tmux wait-for -S p12346-neww-done" 0
       echo foo
       sleep 10
       ' \; wait-for p12346-neww-done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.