Згрупуйте набір процесів так, що коли хтось гине, так це роблять і всі інші процеси в цій групі


5

З різних причин додаток, яке ми маємо, складається з трьох процесів, які неможливо перетворити в єдиний. Ці процеси досить жорстко-лицарські, тому є сенс їх нерестувати і вбивати разом. Наприклад, якщо хтось із них помирає, вся система не працюватиме, тому є сенс просто вбити двох інших.

Чи можна це зробити в Linux?

Відповіді:


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запускається ланцюг ромашок. Це врешті-решт зіграє всіх треш-металів .

Зауважте, що ви не повинні запускати новий набір процесів, поки не будете впевнені, що цей ланцюг вбивств закінчений.


Це розумно. Будь-яка конкретна причина, чому ви використовуєте дужки в команді замість дужок; наприклад (foo ; killall bar 2>/dev/null) &,?
G-Man

@ G-Man Без причин. Зважаючи на те, що &там так чи інакше є нижня оболонка. Якщо є різниця, це тонка; Я цього не досліджував.
Каміль Маціоровський

4

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

Якщо можливо, щоб усі три процеси розпочалися одним і тим же батьківським процесом, це, мабуть, найкращий підхід - дозволити батьківський процес зробити a wait(), який повернеться, коли будь-який з дочірніх процесів припиниться. Якщо це не варіант, напишіть нову програму спеціально для моніторингу. Вам доведеться сказати йому ПІД трьох процесів. Він може перевірити, чи живі вони, періодично намагаючись надсилати їм сигнал 0. (Процес моніторингу повинен запускатися під тим самим UID, що і інші процеси, або як root (UID 0), щоб мати дозвіл на надсилання сигналів до них.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.