while
tmux 상태 표시줄에 무한 루프 bash 스크립트가 포함되어 있습니다 . ~/.tmux/conf에서:
set -g status-right '... #(path/loop.sh) ...'
sh -c
Tmux가 시작된 후 다음을 사용하는 것 같습니다 .
$ ps x | grep loop.sh
23433 pts/4 S+ 0:00 grep --color=auto loop.sh
31814 ? S 0:00 sh -c path/loop.sh
31818 ? S 0:00 /bin/bash path/loop.sh
tmux kill-session
sh -c
프로세스를 종료합니다 . strace
이 작업을 수행하고 세션을 종료 하면 :
$ strace -p 31814
strace: Process 31814 attached
wait4(-1, 0x7ffeacbfbf9c, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=27643, si_uid=1000} ---
+++ killed by SIGTERM +++
그러나 무한 루프로 인해 하위 쉘은 변경되지 않습니다.
$ ps x | grep loop.sh
2443 pts/4 S+ 0:00 grep --color=auto loop.sh
31818 ? S 0:00 /bin/bash path/loop.sh
질문
tmux 세션이 끝난 후 서브쉘이 자동으로 종료되기를 원합니다. SIGTERM
tmux 설정을 변경하거나 프로세스로 전송을 처리하여 이를 수행할 수 있는 방법이 있습니까 sh -c
?
(편집하다:tmux 버전은 2.8입니다)
답변1
예, 시작된 하위 프로세스는 tmux -c "start process here"
해당 세션에서 tmux
살아남는 것 같습니다. 나는 광범위한 매뉴얼 페이지를 자세히 살펴보았고 한동안 명령의 백후크를 tmux
전역적 으로 설정하는 것이 도움이 될 수 있기를 바랐습니다. tmux
백훅의 형태는 다음과 같습니다.
$ tmux set-hook -g after-session-closed your_cmd_here
어디"귀하의 cmd_가 여기 있습니다"무한 루프를 생성하는 하위 프로세스를 종료하는 데 사용할 수 있습니다. 하지만 이것은 도움이 되지 않습니다. 왜냐하면"귀하의 cmd_가 여기 있습니다"실제로 이는 tmux
Linux 쉘 cmd가 아니라 cmd여야 합니다.
대신, 스크립트의 무한 루프 내부에 다음과 같은 줄을 추가하는 것이 빠른 방법입니다 /path/loop.sh
.
[ "x$(ps -e | grep tmux | grep -v grep)" = "x" ] && break
tmux
출력에 활성 프로세스가 표시되지 않으면 무한 루프에서 벗어날 수 있습니다 ps -ae
. 반대로 tmux
관련 프로세스가 표시되면 루프는 영향을 받지 않고 계속됩니다.
실제로 tmux
세션을 종료하지만 시스템에 여전히 활성 프로세스가 있는 극단적인 경우에는 위 테스트의 더 나은 버전은 다음과 같습니다.man tmux
[ $(\ps -e | awk 'BEGIN {rv=0}; tolower($0) ~/tmux/ {if ($4 == "tmux") {rv=1}; exit} END {print rv}') == "1" ] && break
tmux
위의 내용은 의 출력에는\ps -e
나타나지만 주 프로세스로 나타나지 않는 상황, 즉 출력 라인의 4번 위치에 나타나지 않고ps -e
실행 중인 프로세스의 매개변수로 나타나거나 선택적으로 에 포함된 출력으로 나타나는 상황을 다룹니다\ps -e
.ps
cmd 이전과 같이 백슬래시를 추가하여 순수 형식을 사용하는 방법에 유의하세요\ps
. 이는 수정된 버전 의 cmd 가awk
.\ps -eF
\ps -e
$4
$11
HTH.