
Поэтому я постоянно читаю, что эта команда должна завершить все дочерние процессы родительского процесса:
kill -- -$$
Использование отрицательного идентификатора с командой kill ссылается на PGID, и из примеров, которые я видел, следует, что PGID дочерних процессов должен быть PID родительского процесса, но в моей системе это не так.
В моей системе PGID дочернего скрипта совпадает с PGID родительского скрипта, которым оказывается bash.
Что здесь происходит? Примеры неверны или моя система настроена по-другому?
Мне нужно завершить дочерние процессы, не завершая родительский процесс, чтобы не отправлять сигнал завершения в PGID, в котором находится родительский процесс.
решение1
Когда процесс разветвляется, он наследует свой PGID от своего родителя. PGID меняется, когда процесс становитсяруководитель группы процессов, то его PGID копируется из его PID. С этого момента новые дочерние процессы, которые он порождает, и их потомки наследуют этот PGID (если только они не начинают новые собственные группы процессов).
В оболочке с управлением заданиями, такой как большинство интерактивных оболочек, каждое задание помещается в свою собственную группу процессов. Если вы запускаете скрипт оболочки, процесс оболочки, запускающий скрипт, будет лидером группы, а PGID будет равен его PID.
В оболочке без управления заданиями, например в большинстве оболочек, используемых для запуска скриптов, команды выполняются в группе процессов оболочки.
Синтаксис kill -- -N
убивает все процессы в группе с PGID = N. Вы не можете использовать его с произвольным PID, только с PID лидера группы процессов, поскольку это PGID. По сути, это то, как работает оболочка
kill %jobid
синтаксис работает — он внутренне преобразуется %jobid
в PGID задания и отправляет сигнал на этот PGID.
Нет простого способа запустить скрипт в его собственной группе процессов из другого скрипта оболочки. СмотритеКак установить группу процессов скрипта оболочкихотя бы для некоторых предложений.