tmux 상태 표시줄에 포함된 무한 루프 스크립트 종료

tmux 상태 표시줄에 포함된 무한 루프 스크립트 종료

whiletmux 상태 표시줄에 무한 루프 bash 스크립트가 포함되어 있습니다 . ~/.tmux/conf에서:

set -g status-right '... #(path/loop.sh) ...'

sh -cTmux가 시작된 후 다음을 사용하는 것 같습니다 .

$ 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-sessionsh -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 세션이 끝난 후 서브쉘이 자동으로 종료되기를 원합니다. SIGTERMtmux 설정을 변경하거나 프로세스로 전송을 처리하여 이를 수행할 수 있는 방법이 있습니까 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_가 여기 있습니다"실제로 이는 tmuxLinux 쉘 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.
  • pscmd 이전과 같이 백슬래시를 추가하여 순수 형식을 사용하는 방법에 유의하세요 \ps. 이는 수정된 버전 의 cmd 가 awk. \ps -eF\ps -e$4$11

HTH.

관련 정보