Почему PGID моего дочернего процесса не является PID родителя?

13

Поэтому я постоянно читаю, что эта команда должна завершать все дочерние процессы родительского процесса:

kill -- -$$

Использование отрицательного идентификатора с командой kill ссылается на PGID, и из примеров, которые я видел, выясняется, что PGID дочерних процессов должен быть PID родительского процесса, но это не так в моей системе.

В моей системе PGID дочернего элемента совпадает с PGID родительского сценария, который оказывается bash.

Что тут происходит? Были ли неправильные примеры или моя система настроена по-другому?

Что мне нужно сделать, это завершить дочерние процессы без завершения родительского, поэтому я не хочу отправлять сигнал уничтожения в PGID, в котором находится родительский процесс.

TCZ8
источник

Ответы:

11

Я думаю, что вы имеете в виду PGID, что означает идентификатор группы процессов .

Когда процесс разветвляется, он наследует свой PGID от своего родителя. PGID изменяется, когда процесс становится лидером группы процессов , затем его PGID копируется из его PID. С тех пор новые дочерние процессы, которые он порождает, и их потомки наследуют этот PGID (если только они не запускают новые группы процессов самостоятельно).

В оболочке с контролем заданий, такой как большинство интерактивных оболочек, каждое задание помещается в собственную группу процессов. Если вы запустите сценарий оболочки, процесс оболочки, выполняющий сценарий, будет лидером группы, а PGID будет равен PID.

В оболочке без управления заданиями, такой как большинство оболочек, используемых для запуска сценариев, команды запускаются в группе процессов оболочки.

Синтаксис kill -- -Nубивает все процессы в группе с PGID = N. Вы не можете использовать его с произвольным PID, только PID лидера группы процессов, так как это PGID. Это по сути, как оболочка

kill %jobid

Синтаксис работает - он внутренне преобразуется %jobidв PGID задания и отправляет сигнал этому PGID.

Нет простого способа запустить сценарий в отдельной группе процессов из другого сценария оболочки. См. Как установить группу процессов сценария оболочки для некоторых предложений.

Barmar
источник
Вы говорите, что оболочка с или без управления заданиями делает то же самое?
TCZ8
1
Нет. Оболочка с контролем заданий запускает новую группу процессов для каждого задания. Оболочка без управления заданиями не запускает новую группу процессов для каждого задания, она запускает их в своей собственной группе процессов.
Бармар
вау .. я не прочитал это правильно в первый раз. Итак, я думаю, что я хочу, чтобы включить контроль работы? Будет ли это гарантировать, что у потомков есть PGID, соответствующий PID родительского сценария? Или каждый ребенок получит свой уникальный PGID?
TCZ8
Я нашел несколько документов в Интернете по контролю за работой, плохо прохожу это. Спасибо за вашу помощь, Бармар.
TCZ8
1
С контролем работы, каждый ребенок получает свой собственный PGID. Без контроля задания они наследуют PGID родителя. Но родитель мог бы унаследовать свой PGID от своего родителя, если это не лидер группы процессов.
Бармар