Bash와 같은 프로세스를 일시 중지하고 재개하는 방법

Bash와 같은 프로세스를 일시 중지하고 재개하는 방법

이 질문은 다음 질문에 대한 후속 질문입니다.프로세스를 일시 중지하고 재개하는 방법

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+ZFirefox가 일시 중지됩니다. 명령 bg(또는 ) 을 실행하면 fgFirefox가 복원됩니다. 이것은 예상대로 작동합니다.

다른 터미널에서 명령을 실행하면 첫 번째 터미널에 해당 줄이 인쇄 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.

관련 정보