
私は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
フォアグラウンドでは実行されません。ユーザーはここに接続する必要があります。
答え1
マルチプレクサ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
(同じ命令の一部として)命令の後に信号を「待つ」ことです。マルチプレクサコマンドを実行するので、セミコロンを避けてください。マルチプレクサシェルではなく処理する必要があります)ウィンドウコマンドの最後のステップにシグナルを送信します。
醜いまたは不快な方法で命令シーケンスを中断することをより強力にする必要がある場合は、シェルトラップを使用して信号を送信できます(読みやすくするためにビット(?)を並べ替える)。
time \
tmux new-window -t p12346 '
trap "tmux wait-for -S p12346-neww-done" 0
echo foo
sleep 10
' \; wait-for p12346-neww-done
答え2
次の選択肢がより適している可能性があります。
tmux 外部:
mkfifo fifo && tmux new -d '(echo foo;sleep 3) 9> fifo' && time cat fifo
tmux内部:
mkfifo fifo && tmux new-window '(echo foo;sleep 10) 9> fifo' && cat fifo
1つの違いwait-for
は、この方法はデッドマンスイッチのように機能することです。wait-for -S
何らかの理由でコマンドが実行されなくても機能します。
もう1つの違いは、基本プロセスのすべての子プロセスが終了するのを待っていることです(バックグラウンドに自分自身を置くプログラムで通常は他のファイル記述子を明示的に閉じない限り)。
説明:このcat
コマンドは、FIFOのもう一方の端が開くのを待ってから終了します。みんなファイル記述子のインスタンスが閉じられます。これは、ファイル記述子を含むすべてのプロセスが終了したときに発生します。ファイル記述子のプロパティのため、この効果は基本的に親プロセスの開かれたファイル記述子を継承する子プロセスに伝播されます。