続行する前に、答えのない質問を参照してください。Tmux:sendキーが送信したコマンドの終了コードを確認してください。
tmux send-keys
コマンドを送信して正常に終了しますが、サブシェルではrepeat 5; do print This is a test; sleep 1; done
なくサブプロセスとして実行し続けます。
repeat 5; do print This is a test; sleep 1; done
他のタスクを実行する前に、タスクが完全に完了していることを確認する必要がある場合tmux send-keys
。
zshでどのようにこれを達成できますか?
編集:@Stéphane Chazelas:質問を拡張したり、より明確にしたいです。
zshスクリプトにsend-keys
次のような複数のコマンドが含まれている場合:
send-keys 'command1_run_as_subprocess_with_unpredictable_time_to_complete' Enter
send-keys 'command2_run_as_subprocess_with_unpredictable_time_to_complete' Enter
send-keys 'command3_run_as_subprocess_with_unpredictable_time_to_complete' Enter
<...>
それぞれは、send-keys
実行される前に前のジョブが完全に完了するのを待つ必要があります。
あなたのソリューションは上記の場合にどのように適用されますか? :
typeset -A pane_pid=($(for t (id index) tmux lsp -F "#{pane_$t} #{pane_pid}"))
pid=$pane_pid[%0] # pid of process started in first pane
答え1
tmuxウィンドウで実行されているシェルがターミナルデバイスからデータを再度読み取るのを待つことができると思います。
Linuxの場合、
until grep -qw tty_read "/proc/$pid/stack"; do sleep 1; done
$pid
シェルのプロセスIDはどこにありますか?
または、より効率的で短い待ち時間でzsh
:
zmodload zsh/zselect
until [[ $(</proc/$pid/stack) = *tty_read* ]] zselect -t 10
これが機能するには0を含める必要があります/proc/sys/kernel/yama/ptrace_scope
(プロセスが他のプロセスが実行しているタスクを表示できるようにする)。この値を0(有効)に変更すると、sudo sysctl -w kernel.yama.ptrace_scope=0
システムのセキュリティがわずかに低下する可能性があります。
tmux ポッド ID またはインデックスと実行中のプロセスの pid 間のマッピングを取得するには、次のようにします。
typeset -A pane_pid=($(for t (id index) tmux lsp -F "#{pane_$t} #{pane_pid}"))
pid=$pane_pid[%0] # pid of process started in first pane
したがって、2つを組み合わせてください。
zmodload zsh/zselect
wait_for_shell_on_pane_to_read_tty() {
local pane=$1
local -A pane_pid=($(for t (id index) tmux lsp -F "#{pane_$t} #{pane_pid}"))
until [[ $(</proc/$pane_pid[$pane]/stack) = *tty_read* ]] zselect -t 10
}
pane=%0 # replace with the pane you want to send those commands to
# see tmux lsp for the list of panes
for cmd (
'repeat 5; do print This is a test; sleep 1; done'
command1_run_as_subprocess_with_unpredictable_time_to_complete
command2_run_as_subprocess_with_unpredictable_time_to_complete
command3_run_as_subprocess_with_unpredictable_time_to_complete
) {
wait_for_shell_on_pane_to_read_tty $pane
tmux send-keys -t $pane $cmd Enter
}
これらのコマンドラインを順次送信するため、コマンドライン間に遅延はありません。したがって、最初のコマンドを送信した後(まだ実行していない場合)、ウィンドウのシェルはまだttyからデータを読み取っている可能性があります。複数のエラーが発生しました。コマンドラインがすぐに送信されました。