Standardowy lub najlepszy sposób na utrzymanie procesu przy życiu przez init.d

14

Szukam standardowego sposobu lub najlepszej praktyki, aby uruchomić demona przez init.dskrypt powłoki przy życiu.

Lub jeszcze lepiej, czy istnieje sposób, aby utrzymać go przy życiu bezpośrednio /etc/init.d?

W szczególności mam demona o nazwie dtnd zi nieskończoną pętlę, która szuka nieoczekiwanego zakończenia procesu, jeśli istnieje, demon obudzi ich ponownie. Używam również narzędzia start-stop-demon, aby pozwolić precesowi na uruchomienie od danego użytkownika systemu.

Chcę uruchomić tego demona dtnd od uruchomienia. Aby osiągnąć to zachowanie, stworzyłem skrypt init.d, który „zawija” plik dtnd za pomocą poleceń start, stop i status.

Mam 2 pytania, które chciałbym rozwiązać:

  1. Czy istnieje sposób na utrzymanie niektórych procesów ze skryptu powłoki init.d. Czy jest to standardowa / najlepsza metoda?

  2. Zaleca się utrzymanie procesu przy użyciu nieskończonej pętli? Myślę, że lepiej jest użyć jakiegoś polecenia, respawnaby to osiągnąć. To jest poprawne?

Wiem o istnieniu respawnpolecenia. Myślę, że tego potrzebuję, ale nie rozumiem przepływu pracy między /etc/init.d/i /etc/init. Czy ktoś może mi pomóc?

Zauważ, że nie mam ani dorobkiewicz inittab (Wolno mi tylko do użytku /etc/init, /etc/init.d, croni narzędzia systemowe jak start-stop-daemon. Mam na myśli, tylko narzędzia domyślne)

Dziękuje bardzo za Twój czas!

Adrian Antunez
źródło

Odpowiedzi:

13

Debian w końcu będzie miał systemd, więc jest to sposób na zrobienie tego w systemie Linux, który używa systemd (i wielu już to robi; możesz rozważyć zmianę dystrybucji).

Systemd może obsłużyć automatyczne utrzymanie usługi dla Ciebie; żadne inne narzędzia nie są wymagane. Po prostu upewnij się, że Restart=alwaysjest to ustawione w sekcji pliku usługi [Service].

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

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

Dostępnych jest również kilka innych opcji dla bardziej złożonych scenariuszy.

Michael Hampton
źródło
2
Przyszłość pokazuje bardziej elastyczne opcje, ale czy to dotyczy obecnego środowiska / warunków? Instalacja narzędzia wydaje się być ścieżką najmniejszego oporu w porównaniu do zmiany / aktualizacji dystrybucji wózków widłowych.
ewwhite
@ewwhite To zależy. Debian jest systemowy od czasu wheezy, ale nie był to domyślny init. Powinna być domyślna od jessie. A ponieważ nasz użytkownik zaakceptował odpowiedź, zakładam, że już korzystał z systemd z innego powodu (lub miał pozwolenie na instalację).
Michael Hampton
systemdwydaje się odrzucić init.dskrypt i bazować na*.service
yurenchen
2
Zamiast bezpośredniej edycji użyj bezpieczniejszego systemctl edit myservice, a następnie systemctl daemon-reloaduruchom ponownie usługę.
Pablo A
@PabloBianchi Utworzenie zastąpienia jest w porządku, jeśli przesłaniasz istniejącą jednostkę usługi. Jeśli tworzysz jednostkę od zera, tak jak OP, to nie ma sensu.
Michael Hampton
3

Można go dodać do /etc/inittabz respawn:

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

To brudny hack, ale z powodzeniem korzystałem z niego na starszych systemach sysv-init.

Dennis Kaarsemaker
źródło
Ale czy demony zwykle nie działają w tle?
symcbean
Dziękuję Ci! Jak mówisz, to brudny hack, ale działa. W każdym razie wolę użycie systemd. Teraz wiem o tym istnieniu.
Adrian Antunez,
To nie działa na RHEL6. Wydaje się, że narzędzie odradzania nie jest dostępne.
Djidiouf,
2

To jeden z głównych powodów, dla których debian przechodzi na systemd.

sysvinit (/etc/init.d) nie jest w stanie wykryć, czy usługa jest wyłączona / nie odpowiada. Oznacza to, że musisz monitorować te usługi i eskalować, jeśli usługa nie wykona już swojej pracy.

prawdopodobnie najłatwiejszą rzeczą byłoby migrację do innego programu do obsługi demonów, takiego jak systemd (domyślnie w RHEL7, domyślnie w następnym debianie i ubuntu lts), upstart (domyślnie w RHEL6, Ubuntu 12.04 i 14.04), daemontools (jak wspomniano, opracowany przez djb) lub coś innego.

wykonywanie usługi utrzymania przy życiu będzie PITA w sysvinit.

janaurka
źródło
1

Najlepszą praktyką jest upewnienie się, że demony NIE ZATRZYMUJĄ SIĘ przede wszystkim.

W przypadku jego braku może chcesz przyjrzeć się DJB za daemontools

symcbean
źródło
3
Oczywiście najlepszą praktyką jest upewnienie się, że moje demony się nie zatrzymają. Ale istnieje wiele aplikacji, które działają zgodnie z podejściem „I-stop-wake-me”, takich jak apache2, mysql, samba, pulseaudio ... Szukałem daemontools i wydaje się to dobre podejście. Niestety nie wolno mi instalować zewnętrznych narzędzi. Muszę to zrobić za pomocą skryptów bash lub start-stop-daemon i konfiguracji init.d.
Adrian Antunez
1

Dla mnie standardowym podejściem jest użycie do tego narzędzia Monit .

Nie mogę do końca powiedzieć z twojego opisu, czy napisałeś coś takiego jak Monit i próbujesz upewnić się, że działa, czy potrzebujesz czegoś, aby obejrzeć stworzonego demona.

ewwhite
źródło
1
Cześć ewwhite, muszę upewnić się, że moja aplikacja działa. Niestety nie wolno mi instalować zewnętrznych narzędzi. Muszę to zrobić za pomocą skryptów bash lub start-stop-daemon i konfiguracji init.d.
Adrian Antunez,
2
@ AdriánAntúnez Jeśli nie możesz zainstalować narzędzi potrzebnych do wykonywania pracy, powinieneś jak najszybciej rozwiązać ten problem.
Michael Hampton
@ AdriánAntúnez Poprosiłeś o „standardowy”. Monit jest dość dobrze znany / ceniony. Prosiłeś o „najlepsze” ... Twoje ograniczenie jest bardziej polityczne. Dlaczego nie pozwolono ci zainstalować oprogramowania?
ewwhite
1
To nie jest niepotrzebne narzędzie lub zależność, jeśli robi to, co chcesz .
ewwhite
1
@ewwhite Przepraszamy, miałem na myśli unikanie zależności od zewnętrznych narzędzi.
Adrian Antunez,