Standard oder beste Methode, um den von init.d gestarteten Prozess am Leben zu erhalten

13

Ich suche nach einer Standardmethode oder bewährten Methode, um einen Daemon, der von einem init.dShell-Skript gestartet wird, am Leben zu erhalten.

Oder noch besser, gibt es eine Möglichkeit, es direkt am Leben zu erhalten /etc/init.d?

Insbesondere habe ich einen Daemon namens dtnd with und eine Endlosschleife, die nach einem unerwartet beendeten Prozess sucht. Falls vorhanden, aktiviert der Daemon sie erneut. Außerdem verwende ich das Start-Stopp-Dämon-Tool, um die Prüfung von einem bestimmten Systembenutzer ausführen zu lassen.

Ich möchte diesen dtnd-Daemon vom Start aus ausführen. Um dieses Verhalten zu erreichen, habe ich ein init.d-Skript erstellt, das die dtnd-Datei mit den Befehlen start, stop und status "umschließt".

Ich habe 2 Fragen, die ich gerne lösen möchte:

  1. Gibt es eine Möglichkeit, einen Prozess aus dem init.d- Shell-Skript am Leben zu erhalten? Ist eine Standard- / Best-Way-Praxis?

  2. Es wird empfohlen, einen Prozess mit Endlosschleife am Leben zu halten? Ich denke, es ist besser, einen Befehl respawnzu verwenden, um das zu erreichen. Es ist richtig?

Ich weiß von der Existenz des respawnBefehls. Ich denke, das ist was ich brauche, aber ich verstehe den Workflow zwischen /etc/init.d/und nicht /etc/init. Kann mir jemand helfen?

Beachten Sie, dass ich inittab nicht weder Emporkömmling (ich nur für einen Benutzer ist /etc/init, /etc/init.d, cronund System - Tools wie start-stop-daemon. Ich meine, nur die Standard - Tools)

Vielen Dank für Ihre Zeit!

Adrian Antunez
quelle

Antworten:

13

Debian wird irgendwann systemd haben, also ist dies der Weg, dies auf einem Linux-System zu tun, das systemd verwendet (und viele tun es bereits; Sie könnten erwägen, die Distributionen zu wechseln).

Systemd kann den Dienst automatisch für Sie am Leben erhalten. Es sind keine weiteren Werkzeuge erforderlich. Stellen Sie einfach sicher, dass Restart=alwaysim [Service]Abschnitt der Servicedatei festgelegt ist .

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

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

Für komplexere Szenarien stehen auch mehrere andere Optionen zur Verfügung.

Michael Hampton
quelle
2
Während die Zukunft flexiblere Optionen bietet, berücksichtigt dies das aktuelle Umfeld / die aktuellen Bedingungen? Die Installation eines Werkzeugs scheint der Weg des geringsten Widerstands im Vergleich zu einer Änderung / Aufrüstung der Gabelstaplerverteilung zu sein.
Ewwhite
@ewwhite Kommt drauf an. Debian hat seit wheezy systemd, aber es war nicht das Standard-Init. Dies sollte die Standardeinstellung von Jessie sein. Und da unser Benutzer die Antwort akzeptiert hat, habe er vermutlich systemd bereits aus einem anderen Grund verwendet (oder die Berechtigung zum Installieren gehabt).
Michael Hampton
systemdinit.dSkript verwerfen & Basis auf*.service
yurenchen
2
Anstelle der direkten Nutzung der Bearbeitung der sichereren systemctl edit myservice, dann systemctl daemon-reloadund Neustart myservice.
Pablo A
@PabloBianchi Das Erstellen einer Außerkraftsetzung ist in Ordnung, wenn Sie die Einheit eines vorhandenen Dienstes außer Kraft setzen. Wenn Sie eine Einheit von Grund auf neu erstellen, wie es das OP getan hat, ist dies sinnlos.
Michael Hampton
3

Sie könnten es hinzufügen /etc/inittabmit respawn:

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

Es ist ein schmutziger Hack, aber ich habe ihn in der Vergangenheit erfolgreich auf älteren sysv-init-Systemen eingesetzt.

Dennis Kaarsemaker
quelle
Aber laufen Daemons nicht normalerweise mit setsid () und fork () im Hintergrund?
symcbean
Vielen Dank! Wie Sie sagen, es ist ein schmutziger Hack, aber es funktioniert. Auf jeden Fall bevorzuge ich die Verwendung von systemd. Jetzt weiß ich davon Existenz.
Adrian Antunez
Dies funktioniert nicht mit RHEL6. Das Respawn-Dienstprogramm scheint nicht verfügbar zu sein.
Djidiouf
2

Nun, das ist einer der Hauptgründe, warum Debian zu systemd wechselt.

sysvinit (/etc/init.d) kann nicht erkennen, ob ein Dienst nicht verfügbar ist oder nicht reagiert. Dies bedeutet, dass Sie diese Dienste überwachen und eskalieren müssen, wenn ein Dienst seine Aufgabe nicht mehr erfüllt.

wahrscheinlich ist es am einfachsten, auf einen anderen Daemonhandler zu migrieren, wie systemd (Standard in RHEL7, wird Standard in next debian und ubuntu lts sein), upstart (Standard in RHEL6, Ubuntu 12.04 und 14.04), daemontools (wie erwähnt, entwickelt von djb) oder was anderes.

Die Aufgabe, einen Dienst am Leben zu erhalten, übernimmt PITA in sysvinit.

Janaurka
quelle
1

Am besten stellen Sie sicher, dass Ihre Daemons überhaupt nicht anhalten.

Andernfalls möchten Sie vielleicht einen Blick auf die daemontools von DJB werfen

symcbean
quelle
3
Natürlich ist es die beste Methode, sicherzustellen, dass meine Dämonen nicht aufhören. Aber es gibt viele Anwendungen, die dem If-I-Stop-Wake-Me-Ansatz folgen, wie Apache2, MySQL, Samba, Pulseaudio ... Ich habe nach Daemontools gesucht und es scheint ein guter Ansatz zu sein. Leider darf ich keine externen Tools installieren. Ich muss es mit Bash-Scripting oder Start-Stop-Daemon und init.d configs tun.
Adrian Antunez
1

Der Standardansatz für mich ist die Verwendung des Monit-Dienstprogramms .

Ich kann Ihrer Beschreibung nicht ganz entnehmen, ob Sie etwas wie Monit geschrieben haben und versuchen, sicherzustellen, dass es ausgeführt wird, oder ob Sie etwas benötigen, um den von Ihnen erstellten Daemon zu beobachten.

ewwhite
quelle
1
Hallo ewwhite, ich muss sicherstellen, dass meine Anwendung läuft. Leider darf ich keine externen Tools installieren. Ich muss es mit Bash-Scripting oder Start-Stop-Daemon und init.d configs tun.
Adrian Antunez
2
@ AdriánAntúnez Wenn Sie die für Ihre Arbeit erforderlichen Tools nicht installieren dürfen, sollten Sie das Problem so schnell wie möglich beheben.
Michael Hampton
@ AdriánAntúnez Du hast nach "Standard" gefragt. Monit ist ziemlich bekannt. Sie haben nach dem "Besten" gefragt ... Ihre Einschränkung ist eher eine politische. Warum dürfen Sie keine Software installieren?
Ewwhite
1
Es ist kein unnötiges Tool oder eine unnötige Abhängigkeit, wenn es das tut, was Sie wollen .
Ewwhite
1
@ewwhite Sorry, ich meinte damit Abhängigkeiten von externen Tools zu vermeiden.
Adrian Antunez