bash처럼 프로세스를 일시 중단하고 다시 시작하는 방법


13

이 질문은 후속 작업입니다. 프로세스를 일시 중단하고 다시 시작하는 방법

그놈 터미널의 bash 세션에서 파이어 폭스를 시작했습니다.

프로세스 트리는 다음과 같습니다.

$ 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

CTRL+Zbash에 충돌하면 파이어 폭스가 일시 중단됩니다. 명령 bg(또는 fg)을 실행하면 firefox가 다시 시작됩니다. 이것은 예상대로입니다.

kill -s SIGTSTP 27980다른 터미널 에서 명령을 실행 [1]+ Stopped firefox하면 첫 번째 터미널에서 줄 을 인쇄 CTRL+Z하지만 (을 누르는 것처럼 ) 파이어 폭스를 중단하지 않습니다. 쉘 스크립트 만 일시 중단한다고 가정합니다.

kill -s SIGTSTP 27989다른 터미널에서 명령 (PID를 기록하십시오)을 발행하면 파이어 폭스가 일시 중단됩니다. 첫 번째 터미널은이 점에 유의하지 않습니다.

bash는 전체 프로세스 트리를 어떻게 일시 중단합니까? 그것은 단지 나무를 가로 지르고 SIGTSTP 모든 아이들을 통과합니까?



당신은 추가해야합니다 pgid당신에 ps대해 이야기 @geekosaur 프로세스 그룹을 참조하는 명령.
ninjalj

답변:


17

쉘 작업은 "프로세스 그룹"에 있습니다. PGRP확장 된 ps출력 에서 열을 보십시오 . 이들은 작업 제어 및 터미널 "실제 또는 pty"소유자를 결정하는 데 모두 사용됩니다.

프로세스 그룹은 그룹의 첫 번째 프로세스 ( "프로세스 그룹 리더")에 의해 식별되므로 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.


7
그건 그렇고, 입력 할 때 bash하지 말고 ; 이후 의 프로세스 그룹은 단말기의 현재 프로세스 그룹 단말 드라이버 인 (pedantically, 회선 제어)는 전송을 처리하는 그룹의 모든 프로세스. 그냥 거기에 보내고 (및 기타 작업). 같은 다른 단말기 신호 와 동일한 방식으로 작업. (메타 : SE는 ctrl-backslash를 싫어한다 ..)SIGTSTP^ZfirefoxSIGTSTPbashwaitpid()^C^\
괴짜
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.