계속하기 전에 답이 없는 질문을 참조하세요.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에서 데이터를 읽고 있을 수 있습니다. 여러 오류가 발생했습니다. 명령줄이 즉시 전송되었습니다.