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