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

Проблема: вы используете os / exec для запуска дочернего процесса, но вам необходимо завершить его при определенных условиях, например после тайм-аута 3 секунды.

Решение. Просто вызовите cmd.Process.Kill (), когда сработает ваше условие:

Проблема: дочерний процесс выполняет собственный дочерний процесс (они растут так быстро), но, к сожалению, приведенное выше решение убивает только ребенка, но не внука:

Как видите, процесс watch все еще активен и был принят init (PPID = 1). Причина этого в том, что Go под капотом использует kill (2) для отправки сигнала KILL на PID процесса sh, но не процесса watch, превращая его в сироту. Это совершенно нормальное поведение для языка программирования unix, но нежелательно для многих случаев использования.

Решение: помимо отправки сигнала одному PID, kill (2) также поддерживает отправку сигнала в группу процессов с помощью передача идентификатора группы процессов (PGID) как отрицательного числа. Дочерние процессы по умолчанию получают тот же PGID, что и их родительские, поэтому, чтобы избежать самоубийства, нам также нужно попросить Go создать новую группу процессов для нашего дочернего процесса, установив Setpgid поле syscall.SysProcAttr. Собирая все вместе, получаем следующее:

Внутренне это заставит Go вызвать setpgid (2) между fork (2) и execve (2), чтобы назначить дочернему процессу новый PGID идентичен его PID. Это позволяет нам убить все процессы в группе процессов, отправив KILL на -PID процесса, который совпадает с -PGID . Предполагая, что дочерний процесс не использовал setpgid (2) при создании своего собственного дочернего процесса, это должно убить ребенка вместе со всеми его дочерними процессами в любых системах * Nix.

Дополнительная литература. Управление процессами в unix A - сложная тема, поэтому я рекомендую использовать ресурсы ниже, чтобы узнать больше.

Я помню, когда можно было понять Unix.
- Роб Пайк (говорит об управлении процессом)