Was ist der richtige Weg, um abhängige Dienste während der Paketinstallation neu zu starten?

10

Ich erstelle ein Konfigurationspaket und möchte Dienste stoppen und neu starten, deren Konfiguration betroffen ist. Im Moment bin ich mit der service [stop|restart]in {pre,post}{inst,rm}Art und Weise. Ich habe irgendwo eine Frage gelesen, invoke-rc.ddie der richtige Weg ist, weil sie die Benutzerpräferenzen für einen Dienst berücksichtigt. Ich konnte jedoch keine Richtlinien dazu finden. Kennt jemand solche Richtlinien? Oder haben Sie einen Rat, welchen Weg ich wählen soll? Das Paket ist für den internen Gebrauch bestimmt und wird voraussichtlich erst in den nächsten zwei Jahren für den 14.04. Ich möchte jedoch meinem Nachfolger einen möglichst sauberen Zustand hinterlassen, so denke systemdich auch.

Von der invoke-rc.dManpage :

Der gesamte Zugriff auf die Init-Skripte durch die Betreuer-Skripte der Debian-Pakete sollte über invoke-rc.d erfolgen .

Aus dem Debian Policy Manual, Kapitel 9, Abschnitt 3.3 :

Maintainer sollten die Abstraktionsschicht verwenden, die von den Programmen update-rc.d und invoke-rc.d bereitgestellt wird, um mit Initskripten in den Skripten ihrer Pakete wie postinst, prerm und postrm umzugehen.

...

Die Paketverwaltungsskripte müssen invoke-rc.d verwenden, um die Inetscripts /etc/init.d/* aufzurufen, anstatt sie direkt aufzurufen.

Debian hat verwendet sysv-initund wird direkt zu wechseln systemd, und ich nehme an , dass das Richtlinienhandbuch zu gegebener Zeit aktualisiert wird, um darauf zu verweisen systemctl. Was ich jedoch unsicher bin, ist Folgendes: Soll ich invoke-rc.danstelle von verwenden service? Ich kann sagen, dpkgdass ich an einigen Dateien interessiert bin (über Trigger). Gibt es also eine Möglichkeit zu erkennen, dpkgdass ich auch an einigen Diensten interessiert bin und dpkgden Neustart / Neuladen durchführen kann?

Zur Verdeutlichung: Ich schreibe keine Init-Skripte. Ich stelle ein Paket mit Konfiguration für andere Anwendungen wie Puppet, NTP usw. bereit, daher stoppe ich die entsprechenden Dienste in den Skripten und starte sie neu.

Hier zum Beispiel ist eine Docker Ausgabe über invoke-rc.dvs service. Das Problem ist noch offen, und eine Person, wahrscheinlich ein Betreuer, kommentiert, dass sie definitiv daran interessiert sind, dies richtig zu machen - offensichtlich ist keiner von uns sicher, was das ist. (Meine Frage ist unabhängig von diesem Thema.)

muru
quelle

Antworten:

5

Ich würde weiterhin die Pre / Post-Inst-Skripte verwenden.

preinst - Dieses Skript wird ausgeführt, bevor dieses Paket aus seiner Debian-Archivdatei (".deb") entpackt wird. Viele 'Preinst'-Skripte stoppen Dienste für Pakete, die aktualisiert werden, bis ihre Installation oder Aktualisierung abgeschlossen ist (nach der erfolgreichen Ausführung des' Postinst'-Skripts).

postinst - Dieses Skript schließt normalerweise alle erforderlichen Konfigurationen des Pakets foo ab, sobald foo aus seiner Debian-Archivdatei (".deb") entpackt wurde. Häufig fordern 'postinst'-Skripte den Benutzer zur Eingabe auf und / oder warnen den Benutzer, dass er, wenn er Standardwerte akzeptiert, daran denken sollte, dieses Paket nach Bedarf neu zu konfigurieren. Viele 'postinst'-Skripte führen dann alle Befehle aus, die zum Starten oder Neustarten eines Dienstes erforderlich sind, sobald ein neues Paket installiert oder aktualisiert wurde.

Siehe - https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html

Die Syntax zum Aufrufen von start | stop | restart wird als Bedingung geschrieben (siehe https://www.debian.org/doc/debian-policy/ch-opersys.html, Abschnitt 9.3.3.2 Ausführen von Initscripts)

wenn welche invoke-rc.d> / dev / null 2> & 1; dann

invoke-rc.d-Paket

sonst

/etc/init.d/package

fi

so ...

if which service >/dev/null 2>&1; then
        service package <action>
elif which invoke-rc.d >/dev/null 2>&1; then
        invoke-rc.d package <action>
else
        /etc/init.d/package <action>
fi

und füge bei Bedarf eine weitere Bedingung für systemd hinzu;)

Ja, der richtige Weg, um einen Dienst zu starten | zu stoppen | neu zu starten, ist, wenn möglich, das entsprechende Wrapper-Skript (invoke-rc.d / system), anstatt das Init-Skript (/etc/init.d/package) und aufzurufen Zurückgreifen auf das Skript /etc/init.d, wenn kein Wrapper verfügbar ist.

Panther
quelle
Das beantwortet so ziemlich die meisten meiner Zweifel, bis auf einen. Die invoke-rc.dManpage und die Debian-Richtliniendokumente weisen uns an, sie in Verbindung mit /etc/init.d/Skripten zu verwenden (möglicherweise, weil sie noch sysv-init verwendet haben). Wie ändert sich das mit Upstart oder systemd?
Muru
Aktualisieren Sie Ihre Frage oder veröffentlichen Sie einen Link zu den Informationen, die Sie lesen. Ich habe auf der Manpage nichts über Verpackung gesehen. Ich nehme an, es hängt von Ihrem Dienst und dem Init-Skript ab (ist es upstart? Systemd?). Sie fragen auf askubuntu.com, und ubuntu verwendet upstart , also askubuntu.com/questions/58404/how-to-start-and-stop -a-Service . Wenn Ihr Paket ein altes Init-Skript verwendet, sollte es vorerst in Upstart und auf lange Sicht in systemd konvertiert werden.
Panther
Ich habe die Frage aktualisiert.
Muru
Es gibt keine einfache oder einheitliche Antwort auf die Frage, da "es darauf ankommt". Dies ist eine vorübergehende Situation, da Ubuntu und Debian beide systemd verwenden. Sie sollten invoke-rc.d für Dienste unter Debian (oder Ubuntu) verwenden, die sysv-init und service verwenden ... unter Ubuntu für Dienste, die upstart verwenden. Es ist Scripting, also sei kreativ, wenn nötiginvoke-rc.d ... || service ...
Panther
Ich dachte, Sie fragen, ob Sie die Pre / Post-Inst-Skripte verwenden sollen, nicht die Syntax Ihres Skripts.
Panther
0

Ein besserer Weg für systemd-Systeme ist die Verwendung von deb-systemd-invoke .

Razvan Grigore
quelle
1
Bitte geben Sie weitere Informationen zur Verwendung deb-systemd-invoke.
Cynplytholowazy