내 자식 프로세스의 PGID가 부모의 PID가 아닌 이유는 무엇입니까?


13

그래서 나는이 명령이 부모 프로세스의 모든 자식 프로세스를 종료해야한다는 것을 어디에서나 계속 읽습니다.

kill -- -$$

kill 명령에 음수 ID를 사용하면 PGID가 참조되고 예제에서 하위 프로세스의 PGID는 부모의 PID이어야하지만 내 시스템의 경우는 아닙니다.

내 시스템에서 자식의 PGID는 bash 인 것으로 밝혀진 부모 스크립트의 PGID와 같습니다.

무슨 일이야? 예제가 잘못되었거나 시스템이 다르게 설정 되었습니까?

달성해야 할 것은 부모를 종료하지 않고 자식 프로세스를 종료하여 부모가있는 PGID에 킬 신호를 보내고 싶지 않습니다.

답변:


11

Process Group ID 를 나타내는 PGID를 의미한다고 생각합니다 .

프로세스가 분기되면 상위에서 PGID를 상속합니다. 프로세스가 프로세스 그룹 리더 가되면 PGID가 변경되고 해당 PGID가 PID에서 복사됩니다. 그때부터 새 자식 프로세스는 자신의 새 프로세스 그룹을 시작하고 (자신의 새 프로세스 그룹을 시작하지 않는 한) 그 하위 항목은 해당 PGID를 상속합니다.

대부분의 대화식 쉘과 같이 작업 제어가있는 쉘에서 각 작업은 자체 프로세스 그룹에 배치됩니다. 쉘 스크립트를 실행하면 스크립트를 실행하는 쉘 프로세스가 그룹 리더가되고 PGID는 PID와 같습니다.

스크립트를 실행하는 데 사용되는 대부분의 쉘과 같이 작업 제어가없는 쉘에서 명령은 쉘의 프로세스 그룹에서 실행됩니다.

구문 kill -- -N은 PGID = N 인 그룹의 모든 프로세스를 종료합니다. PGID이므로 프로세스 그룹 리더의 PID 만 임의의 PID와 함께 사용할 수 없습니다. 이것은 본질적으로 쉘의 방법입니다

kill %jobid

구문 작동-내부적으로 %jobid작업의 PGID로 변환 하고 해당 PGID로 신호를 보냅니다.

다른 셸 스크립트의 자체 프로세스 그룹에서 스크립트를 실행하는 간단한 방법은 없습니다. 그래도 몇 가지 제안 은 쉘 스크립트의 프로세스 그룹을 설정하는 방법을 참조하십시오 .


작업 제어 유무에 관계없이 쉘이 동일한 작업을 수행한다고 말하고 있습니까?
TCZ8 2016 년

1
작업 제어가있는 쉘은 각 작업에 대해 새 프로세스 그룹을 시작합니다. 작업 제어가없는 쉘은 각 작업에 대해 새 프로세스 그룹을 시작하지 않고 자체 프로세스 그룹에서 실행합니다.
Barmar

와우 .. 처음 읽지 않았다. 그래서 내가 원하는 것은 작업 제어를 켜는 것 같아요? 자녀에게 부모 스크립트의 PID와 일치하는 PGID가 있는지 확인 하시겠습니까? 또는 각 어린이가 고유 한 PGID를 받습니까?
TCZ8

작업 제어에서 온라인으로 일부 문서를 찾았습니다. 도움을 주셔서 감사합니다 Barmar.
TCZ8 2018 년

1
작업 제어를 통해 각 어린이는 자체 PGID를받습니다. 작업 제어가 없으면 상위의 PGID를 상속합니다. 그러나 프로세스 그룹 리더가 아닌 경우 상위 상위 에서 PGID를 상속했을 수 있습니다 .
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.