Стандартний або найкращий спосіб зберегти живий процес, розпочатий програмою init.d


14

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

Або ще краще, чи є спосіб зберегти його живим безпосередньо /etc/init.d?

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

Я хочу запустити цей dtnd демон від запуску. Для досягнення цієї поведінки я створив сценарій init.d, який "обгортає" файл dtnd, використовуючи команди start, stop та status.

У мене є два питання, які я хотів би вирішити:

  1. Чи є спосіб домогтися збереження деякого процесу із сценарію оболонки init.d. Чи є стандартним / найкращим способом практики?

  2. Рекомендується тримати процес живим з нескінченним циклом? Я думаю, що для цього краще скористатися якоюсь командою respawn. Це вірно?

Я знаю про існування respawnкоманди. Я думаю, що це те, що мені потрібно, але я не розумію робочий процес між /etc/init.d/і /etc/init. Хтось може мені допомогти?

Зверніть увагу , що у мене немає ні inittab вискочки (я тільки дозволено використовувати /etc/init, /etc/init.d, cronі системні інструменти , як start-stop-daemon. Я маю в виду, тільки інструменти за замовчуванням)

Дякую вам за ваш час!


Відповіді:


13

У Debian врешті-решт відбудеться systemd, тому це спосіб зробити це в системі Linux, яка використовує systemd (і багато хто вже робить це, ви можете розглянути можливість переключення дистрибутивів).

Systemd може підтримувати автоматичну підтримку служби для вас; ніяких інших інструментів не потрібно. Просто переконайтеся, що Restart=alwaysце встановлено в розділі файлу службового файлу [Service].

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

Також є кілька інших варіантів для складніших сценаріїв.


2
Хоча майбутнє показує більш гнучкі варіанти, чи це піклується про поточне середовище / умови? Здається, встановлення інструменту - це шлях найменшого опору порівняно зі зміною / оновленням розподілу навантажувача.
ewwhite

@ewwhite Це залежить. Debian працює з хрипів, але це не був init за замовчуванням. Це має бути дефолтом від Джессі. А оскільки наш користувач прийняв відповідь, я припускаю, що він вже використовував systemd з іншої причини (або мав дозвіл на його встановлення).
Майкл Хемптон

systemdЗдається, init.d*.service
відкиньте

2
Замість прямого редагування використовуйте безпечніший systemctl edit myservice, потім systemctl daemon-reloadі перезапустіть службу.
Пабло А

@PabloBianchi Створення перезапису - це добре, якщо ви переосмислите наявний сервісний блок. Якщо ви створюєте підрозділ з нуля, як це робив ОП, то безглуздо.
Майкл Хемптон

3

Ви можете додати його за /etc/inittabдопомогою respawn:

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

Це брудний злом, але я його успішно використовував у минулому на старих системах sysv-init.


Але хіба демони не мають унікально cal setid () та fork () працювати у фоновому режимі?
symcbean

Дякую! Як ви кажете, це брудний злом, але він працює. У будь-якому випадку я віддаю перевагу використанню systemd. Тепер я знаю про його існування.
Адріан Антунез

Це не працює на RHEL6. Утиліта для відновлення не здається доступною.
Djidiouf

2

Ну, це одна з головних причин, чому debian переходить на systemd.

sysvinit (/etc/init.d) не в змозі виявити, якщо служба не працює / не відповідає. Це означає, що вам доведеться стежити за цими послугами та ескалювати, якщо служба більше не виконуватиме свою роботу.

Мабуть, найпростіше зробити це було б перейти на інший daemonhandler типу systemd (за замовчуванням у RHEL7, за замовчуванням у наступних debian та ubuntu lts), upstart (за замовчуванням у RHEL6, Ubuntu 12.04 та 14.04), daemontools (як уже згадувалося, розроблений djb) або щось інше.

виконувати роботу по підтримці служби буде ПДФА в сисвініті.


1

Найкраща практика - це переконатися, що ваші демони НЕ ЗАСТАВЛЯЮТЬСЯ.

В іншому випадку ви можете захотіти поглянути на Djb в DaemonTools


3
Звичайно, найкраща практика полягає в тому, щоб мої демони не зупинилися. Але є багато застосунків, які дотримуються підходу if-I-stop-wake-me, наприклад apache2, mysql, samba, pulseaudio ... Я шукав демодонтів і, здається, хороший підхід. На жаль, мені заборонено встановлювати зовнішні інструменти. Мені це потрібно зробити за допомогою скриптів bash або start-stop-daemon та конфігурацій init.d.
Адріан Антунез

1

Для мене стандартним підходом є використання для цього утиліти Monit .

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


1
Привіт ewwhite, я повинен переконатися, що моя програма працює. На жаль, мені заборонено встановлювати зовнішні інструменти. Мені це потрібно зробити за допомогою скриптів bash або start-stop-daemon та конфігурацій init.d.
Адріан Антунес

2
@ AdriánAntúnez Якщо вам не дозволяється встановлювати інструменти, необхідні для виконання вашої роботи, ви повинні вирішити цю проблему якнайшвидше.
Майкл Хемптон

@ AdriánAntúnez Ви запитували "стандарт". Моніт досить відомий / добре оцінений. Ви просили "кращих" ... Ваша обмеженість - це більше політична. Чому б вам не дозволили встановлювати програмне забезпечення?
ewwhite

1
Це не зайвий інструмент чи залежність, якщо він робить те, що ти хочеш .
ewwhite

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