그래서 저는 이 명령이 상위 프로세스의 모든 하위 프로세스를 종료해야 한다는 내용을 어디서나 읽었습니다.
kill -- -$$
kill 명령에서 음수 ID를 사용하면 PGID를 참조하며, 내가 본 예에서 하위 프로세스의 PGID는 상위 프로세스의 PID여야 하지만 내 시스템에서는 그렇지 않습니다.
내 시스템에서 하위 스크립트의 PGID는 bash인 상위 스크립트의 PGID와 동일합니다.
여기서 무슨 일이 일어나고 있는 걸까요? 이 예가 잘못되었거나 시스템 설정이 다른가요?
내가 달성해야 할 것은 상위 프로세스를 종료하지 않고 하위 프로세스를 종료하는 것이므로 상위 프로세스가 있는 PGID에 종료 신호를 보내고 싶지 않습니다.
답변1
프로세스가 분기되면 상위 프로세스로부터 PGID를 상속받습니다. 프로세스가 프로세스가 되면 PGID가 변경됩니다.프로세스팀장를 선택한 다음 PID에서 PGID를 복사합니다. 그 시점부터 새로운 하위 프로세스가 생성되고 그 하위 프로세스는 해당 PGID를 상속받습니다(자체 새 프로세스 그룹을 시작하지 않는 한).
대부분의 대화형 쉘과 같이 작업 제어 기능이 있는 쉘에서는 각 작업이 자체 프로세스 그룹에 배치됩니다. 쉘 스크립트를 실행하면 스크립트를 실행하는 쉘 프로세스가 그룹 리더가 되고 PGID는 해당 PID와 동일합니다.
스크립트를 실행하는 데 사용되는 대부분의 쉘과 같이 작업 제어가 없는 쉘에서 명령은 쉘의 프로세스 그룹에서 실행됩니다.
이 구문은 kill -- -N
PGID = N인 그룹의 모든 프로세스를 종료합니다. PID와 함께 사용할 수 없으며 프로세스 그룹 리더의 PID만 사용할 수 있습니다. PGID이기 때문입니다. 이것은 기본적으로 쉘 방식입니다.
kill %jobid
%jobid
구문은 작동합니다. 내부적으로 작업의 PGID로 변환되고 신호가 해당 PGID로 전송됩니다.
다른 쉘 스크립트의 자체 프로세스 그룹에서 스크립트를 실행하는 쉬운 방법은 없습니다. 바라보다쉘 스크립트의 프로세스 그룹을 설정하는 방법그래도 조언이 필요합니다.