Zsh/Tmux: 子プロセスが成功するまで待ちます。

Zsh/Tmux: 子プロセスが成功するまで待ちます。

続行する前に、答えのない質問を参照してください。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からデータを読み取っている可能性があります。複数のエラーが発生しました。コマンドラインがすぐに送信されました。

おすすめ記事