5

По разным причинам приложение, которое мы имеем, состоит из 3 процессов, которые нельзя объединить в один. Эти процессы довольно трудолюбивы, поэтому имеет смысл порождать и убивать их вместе. Например, если один из них умрет, вся система не будет работать, поэтому имеет смысл просто убить двух других.

Можно ли это сделать в Linux?

2 ответа2

4

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

Если возможно, чтобы все три процесса были запущены одним и тем же родительским процессом, это, вероятно, лучший подход - сделать так, чтобы родительский процесс выполнял wait() , который будет возвращаться при завершении любого из дочерних процессов.  Если это не вариант, напишите новую программу специально для мониторинга.  Вы должны будете сообщить ему PID трех процессов.  Он может проверить, живы ли они, периодически пытаясь послать им сигнал 0.  (Процесс мониторинга должен запускаться с тем же UID, что и другие процессы, либо с правами root (UID 0), чтобы иметь разрешение на отправку сигналов им.)

3

В целом я поддерживаю ответ G-Man. Я хотел бы представить быстрое решение, которое может быть достаточно в некоторых обстоятельствах.

Пусть три исполняемых файла будут foo , bar и baz . Предположения:

  • вы можете запустить их вручную;
  • вы запускаете их как одного и того же пользователя;
  • Вы запускаете не более одного foo , одного bar и одного baz в любой момент времени.

Вместо foo беги foo ; killall bar 2>/dev/null .
Вместо bar беги bar ; killall baz 2>/dev/null .
Вместо baz беги baz ; killall foo 2>/dev/null .

Если вы хотите запустить foo в фоновом режиме, правильный синтаксис выглядит так:

{ foo ; killall bar 2>/dev/null ; } &

Аналогично с bar и baz . Таким образом, вы можете запустить их из одной оболочки, если хотите.

Решение масштабируется до любого разумного количества процессов. Когда один процесс завершается, запускается цепочка killall . Это в конечном итоге сыграет трэш-метал, убивай всех.

Обратите внимание, что вы не должны запускать новый набор процессов, пока не будете уверены, что цепочка убийств завершена.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .