이 질문은 다음 질문에 대한 후속 질문입니다.프로세스를 일시 중지하고 재개하는 방법
gnome-terminal의 bash 세션에서 Firefox를 시작했습니다.
프로세스 트리는 다음과 같습니다.
$ ps -e -o pid,ppid,cmd -H
1828 1 gnome-terminal
26677 1828 bash
27980 26677 /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980 /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985 /usr/lib/firefox-3.6.15/firefox-bin
28012 27989 /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true
Bash를 클릭하면 CTRL+Z
Firefox가 일시 중지됩니다. 명령 bg
(또는 ) 을 실행하면 fg
Firefox가 복원됩니다. 이것은 예상대로 작동합니다.
다른 터미널에서 명령을 실행하면 첫 번째 터미널에 해당 줄이 인쇄 kill -s SIGTSTP 27980
되지만 [1]+ Stopped firefox
(클릭했을 때와 마찬가지로 CTRL+Z
) Firefox가 일시 중지되지는 않습니다. 나는 단지 쉘 스크립트를 일시 중지한다고 생각합니다.
kill -s SIGTSTP 27989
다른 터미널 (PID 참고) 에서 명령을 실행하면 Firefox가 일시 중지됩니다. 첫 번째 터미널은 이를 인지하지 못했습니다.
Bash에서 전체 프로세스 트리를 걸는 방법은 무엇입니까? 트리를 순회하고 모든 하위 노드에 SIGTSTP 신호를 보냅니다.
답변1
셸 작업은 프로세스 그룹에 존재하며 PGRP
확장 출력 ps
의 열을 봅니다. 이는 작업 제어와 터미널(실제 또는 개인)을 "소유"하는 사람을 결정하는 데 모두 사용됩니다.
POSIX(System V에서 가져옴)는 프로세스 그룹이 그룹의 첫 번째 프로세스("프로세스 그룹 리더")에 의해 식별되기 때문에 음수 프로세스 ID를 사용하여 프로세스 그룹을 나타냅니다. 따라서 을 사용하여 ps
프로세스 그룹을 결정한 다음 을 사용합니다 kill -s TSTP "-$pgrp"
. (노력하다 ps -u"$USER" -opid,ppid,pgrp,cmd
.)
프로세스 트리에서 프로세스 그룹은 firefox
스크립트 시작으로 시작하므로 bash
프로세스 그룹은 27980이고 명령은 입니다 kill -s TSTP -27980
.
물론 프로세스 그룹을 복원하려면 kill -s CONT -- -27980
.