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 창에서 실행 중인 셸이 터미널 장치에서 데이터를 다시 읽을 때까지 기다릴 수 있다고 생각합니다.

리눅스의 경우,

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

따라서 두 가지를 결합하십시오.

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에서 데이터를 읽고 있을 수 있습니다. 여러 오류가 발생했습니다. 명령줄이 즉시 전송되었습니다.

관련 정보