Чи може системний виявити та вбити вивішені процеси?


16

Працюючи над рішенням, яке використовує блокування файлів, я вважаю, що мій код потрапляє в глухий кут. Я використовую systemd, щоб розпочати процес запуску системи. Використання сигналу тривоги (3) - це варіант, але мені було цікаво, чи існує спосіб для системного виявити вивішені процеси та перезапустити їх?

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

Цікаво, чи існує кращий спосіб контролювати процеси через systemd чи іншим способом.


Напевно, ні. Як ви можете сказати, чи висіли процес? Що робити, якщо вам дійсно потрібно щось подібне for(;;) do_something();?
mvp

4
Строго кажучи, якщо ваш код висить, ви повинні налагодити цю проблему. Вбити його через systemd (припустимо, що це можна зробити, що я не вірю) або будь-яким іншим способом - це правильно зробити, як ви налагодите це. Але ви просто не можете залишити його вільним, щоб зайти в глухий кут.
MariusMatutiae

Відповіді:


25

Так; але спочатку виправте свою помилкову програму, перш ніж поповнити systemd.

MariusMatutiae цілком правильний. У вас проблема з вашою програмою. Це тупики. Спілкування з systemd не є відповіддю. У кращому випадку це відволікання. Зафіксуйте програму, щоб вона не була порушена. Спрямуйте свою енергію на потрібне.

Але це означає, що інші люди збираються приїжджати сюди через назву питання, а не власне питання. Для їх користі ось відповідь на заголовок, ігноруючи власне питання:

Так, systemd може відслідковувати dæmons і автоматично перезапускати їх, якщо вони перестають говорити. Не будь-які старі dæmons, хоча. Як зазначає mvp, немає жодного способу дізнатися, що dæmon завис (у цьому Всесвіті, де проблема зупинки не можна вирішити, принаймні). Ні системна, ні будь-яка інша комп'ютерна програма ніколи не зможуть вивести з нуля, що якась випадкова програма, кинута на них, зайшла в глухий кут, або пішла в нескінченний цикл, або що завгодно. Найкраще, що ви отримаєте тут, - це виявити, що dæmon не виконував регулярну операцію "серцебиття" протягом необхідного періоду часу.

Dæmons, які користуються можливостями сторожової системи systemd, тому повинні бути написані, щоб говорити про специфічний для systemd протокол, sd_notify протокол. Це ускладнює код dæmon a tad. Далі це складно, тому що dæmons, якщо правильно написано, повинен перевірити, чи вони також викликані функцією сторожового дозволу.

Демонстрація цього протоколу для використання можливостей сторожової системи systemd ...

  • … Повинен перевірити наявність WATCHDOG_USECзмінної середовища;
  • ... повинен дзвонити sd_notify () постійно та часто впродовж усього свого життя, з встановленою WATCHDOG=1опцією, з інтервалом приблизно WATCHDOG_USEC/ 2 ("USEC" означає мікросекунди);
  • ... повинен бути Type=notifyвстановлений у своєму одиничному файлі;
  • … Повинен мати NotifyAccess=main(або =all) встановлений у своєму одиничному файлі;
  • ... повинні бути встановлені WatchdogSec=секунди у його одиничному файлі.
  • ... повинен пов'язуватися з libsystemd-daemon.so

Якщо ви хочете дізнатись деталі кодування цього тексту, прочитавши посібник, переконайтеся, що ви перейшли до правильної StackExchange. Це SuperUser. StackOverflow там .

Подальше читання


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