포그라운드에서 앱을 실행하고 CTRL+ (그런 다음 중지)를 눌러 Z백그라운드에 놓습니다 . 다시 작동하게 하기 위해 명령을 실행했습니다 bg %1
(이것이 JOBSPEC입니다).
나는 그것을 다시 실행하려고 노력하지 않을 이유가 무엇인지 생각했습니다 kill -CONT <PID>
. 그래서 나는 jobs -l
PID를 얻기 위해 달려갔고 CONT 신호와 함께 이 pid를 kill과 함께 사용했습니다.
그러나 쇼는 다시 공개되지 않았습니다! jobs -l
CONT로 종료하려고 하면 실행 중이라고 보고되지만 실행 중이 아닙니다(회색으로 표시되므로).
이 명령을 사용하여 애플리케이션 PID를 확인한 ps
결과 두 개의 동일한 명령이 서로 다른 PID(및 상태 Tl
)를 가지고 있음을 발견했습니다.
그런 다음 동일한 것을 사용하여 살펴본 결과 pstree
둘 다 상위 프로세스에 속한다는 것을 알았습니다. jobs -l
백그라운드에 넣은 프로세스가 다른 프로그램을 시작하는 것처럼 보이기 때문에 상위 프로세스는 나열된 프로세스와 다릅니다 . 다른 프로그램이 하위 프로세스를 생성하는 것 같습니다.
제가 주목한 내용을 요약하면 다음과 같습니다.
kill
프로그램을 실행하려면 부모 프로세스에 CONT를 보내 십시오 .상위 프로세스 PID가 보고된 것과 다릅니다
jobs -l
. 즉, CONT 신호를 보내려고 하는 프로세스가jobs -l
.CONT를 부모 프로세스에 보내면 동일한 신호가 자식 프로세스에 적용되지 않습니다.
bg
프로세스를 실행 상태로 되돌리고 모든 하위 프로세스의 상위 프로세스에 CONT 신호를 보내려면 이 명령을 사용합니다 .
내 결론이 맞나요? 그렇다면 이 명령을 사용하면 bg
각 관련 프로세스에 CONT를 보내는 시간이 절약된다는 의미입니다. 이 올바른지?
편집하다제가 명령줄에서 호출하고 백그라운드에 배치하는 주요 애플리케이션은 입니다 git difftool
. 제가 말하는 다른 애플리케이션은 자체적으로 새로운 하위 키를 생성하며, meld
이를 git에서 비교 도구로 설정했습니다.
답변1
먼저, jobs -l
나열된 프로세스는 없지만,프로세스 그룹(일명 일). 각 프로세스 그룹에는 프로세스 ID(pid)가 해당 프로세스 그룹 ID(pgid)와 동일한 프로세스 리더가 있습니다.
리더뿐만 아니라 프로세스 그룹의 모든 프로세스에 신호를 보내려면 kill
pgid에 음수를 사용하여 호출해야 합니다. Kill(2) 맨페이지에서는 이에 대해 설명합니다.
pid가 -1보다 작으면 ID가 -pid인 프로세스 그룹의 모든 프로세스에 sig가 전송됩니다.
셸에서도 동일한 효과가 발생합니다.
$ sh -c 'while echo -n 1; do sleep 1; done'
111^Z
[1]+ Stopped sh -c 'while echo -n 1; do sleep 1; done'
$ jobs -l
[1]+ 11046 Stopped sh -c 'while echo -n 1; do sleep 1; done'
$ kill -CONT 11046
<nothing>
$ kill -CONT -11046
$ 11111111...
이제 결론을 내리십시오.
프로그램을 실행하려면 kill을 사용하여 CONT를 상위 프로세스로 보냅니다.
옳은
상위 프로세스 PID는 jobs -l에서 보고한 PID와 다릅니다. 즉, CONT 신호를 보내야 하는 프로세스가 jobs -l을 사용하여 찾은 프로세스와 다릅니다.
틀렸습니다. 동일한 pid이고 pgid와도 동일합니다.
CONT를 부모 프로세스에 보내면 동일한 신호가 자식 프로세스에 적용되지 않습니다.
옳은
bg 명령을 사용하여 프로세스를 실행 상태로 되돌리고 CONT 신호를 상위 프로세스와 모든 하위 프로세스에 보냅니다.
예, 하지만 상위 프로세스와 하위 프로세스가 모두 동일한 프로세스 그룹에 있는 경우에만 해당됩니다. 또한 각 프로세스에 대해 차례로 kill(2)을 호출하지 않고 pgid(= 프로세스 그룹 리더의 pid)의 음수를 사용하여 한 번만 호출하고 커널에 의존하여 신호를 모든 프로세스에 라우팅합니다. 그 그룹.
답변2
여기서는 이 동작을 볼 수 없습니다.
다음은 명령줄에 그대로 입력한 샘플 코드입니다.
bash -c 'echo This is parent $$; sleep 7; bash -c "echo This is child \$$; sleep 7; echo Child done"; echo This is parent $$ again; sleep 7'
메시지를 받으면 프로세스 일시 중지를
This is child xx
클릭합니다 .CtrlZ실제로 일시중지되었는지 확인하려면 7초 더 기다리세요.
이제
jobs -l
프로세스 리더(상위 PID) 가 나열됩니다. 실제로 이 경우 작업 번호를 사용할 수 있습니다.%1
백그라운드에서 프로세스 계속
kill -CONT %1
나는 아이가 계속해서 종료하고 부모가 끝내도록 하는 것을 보았습니다.
이것은 전체 실행 결과입니다( >$
셸 프롬프트 포함).
>$ bash -c 'echo This is parent $$; sleep 7; bash -c "echo This is child \$$; sleep 7; echo Child done"; echo This is parent $$ again; sleep 7'
This is parent 2004
This is child 10696
[1]+ Stopped bash -c 'echo This is parent $$; sleep 7; bash -c "echo This is child \$$; sleep 7; echo Child done"; echo This is parent $$ again; sleep 7'
>$ jobs -l
[1]+ 2004 Stopped bash -c 'echo This is parent $$; sleep 7; bash -c "echo This is child \$$; sleep 7; echo Child done"; echo This is parent $$ again; sleep 7'
>$ kill -CONT %1
>$ Child done
This is parent 2004 again
자동화된 테스트 도구를 사용하여 더 많은 실험을 하고 싶다면 kill -TSTP ...
키보드에서 생성된 것과 동일한 신호 보내기를 사용할 수 있습니다.CtrlZ