Gibt es von init.d bis upstart eine Brücke?

11

Ich habe ein perfektes Skript für /etc/init.d. Tatsächlich habe ich viele davon, die alle mit dem Tanuki Java Service Wrapper erstellt wurden.

Es scheint mir, dass es eine einfache Vorlage geben könnte, um ein solches Shell-Skript als Upstart-Skript zu verpacken, aber ein bisschen googeln enthüllt keine.

Vermisse ich etwas

bmargulies
quelle

Antworten:

9

Ich kann mich nicht erinnern, eine Vorlage dafür gesehen zu haben. Es ist jedoch ein bisschen ironisch, dass es technisch gesehen ein Emporkömmling ist, der Ihr init.d-Skript dank des Abwärtskompatibilitätsjobs rc und rcS überhaupt erst startet.

Ich würde in Betracht ziehen, alles, was Sie haben, als Startjob neu zu schreiben. Ich weiß jedoch, dass einige Skripte schwer zu konvertieren sind. Deshalb habe ich für einige meiner Skripte eine Weile Folgendes getan:

description "xyz"
author "xyz"
start on runlevel 5
stop on runlevel [!5]

pre-start script
    # do my work here to start the service
end script

post-stop script
    # do work here to stop the service
end script

Abhängig von der Art des Dienstes, ob er fortbesteht oder sich selbst teilt, müssen Sie möglicherweise eine Jobdatei hinzufügen expect forkoder hinzufügen task.

Nur um den Gedanken zu vervollständigen, ist dies normalerweise alles, was es zu einer vollständigen Upstart-Jobdatei gibt. Die gesamte Arbeit vor dem Start ist erledigt, die gesamte Bereinigung ist erledigt. Das einzige, was noch übrig ist, ist der Dienst selbst, der normalerweise hinzugefügt wird mit:

exec service_cmd
KFro
quelle
In der Dokumentation heißt es in der Dokumentation, dass die Laufstufen 3,4 und 5 nicht verwendet werden. Sie sollten also nur Run Level 2 verwenden.
Djangofan
Es ist schon eine Weile her, aber ich bin mir ziemlich sicher, dass 5 mit der GUI gestartet ist, zumindest war es früher so.
Joseph Rogers
6

Ein Punkt für Startjobs ist es also, einfach zu schreiben zu sein.

In init.d-Skripten steckt viel Magie von Shell-Skripten, die immer wieder wiederholt wird. Fallaussagen, Pidfile-Tracking, LSB-Kommentarzeilen. Es ist nicht sehr klar, wie man ein GUTES init.d-Skript schreibt, ohne eines gelesen zu haben.

Wenn Sie sich bereits die Mühe gemacht haben, all das zu schreiben, brauchen Sie keinen Startjob, es sei denn, wie ich in einem anderen Kommentar erwähnt habe, sind Sie von einem anderen Startjob / Ereignis abhängig.

Aber wirklich, Emporkömmling macht die Dinge wirklich einfach. Sie sollten keinen Vorstart benötigen, es sei denn, Sie müssen Dinge wie tmpdirs, ulimits oder Laufzeitargumente einrichten. Sie sollten keinen Post-Stop benötigen, es sei denn, Sie möchten sicherstellen, dass Sie nach einem Service aufräumen (der Service sollte beim normalen Beenden wirklich nach sich selbst aufräumen).

Oft läuft ein riesiges init.d-Skript mit vielen Optionen auf einen 10 - 15-Zeilen-Upstart-Job hinaus. Bei den komplexesten init.d-Skripten kann der größte Teil ihrer Logik in Pre-Starts gespeichert werden. Der Schlüssel dort ist, dass es nur ein kleiner Codeausschnitt ist, um die Umgebung für den Prozess einzurichten, und keine Logik für die Behandlung von Start / Stopp / Respawn / etc.

Das Schwierigste und das, was die Leute am häufigsten falsch machen, ist zu wissen, wann sie ihren Job beginnen / beenden müssen. start on runlevel [2345]scheint logisch, ignoriert jedoch die Tatsache, dass das Netzwerk zu diesem Zeitpunkt parallel geschaltet wird, ebenso wie lokale Dateisystem-Mounts. Der Schlüssel besteht darin, herauszufinden, was genau Sie benötigen (andere Dienste, Dateisysteme, Netzwerk usw.), um zum Laufen zu kommen, und zu starten, wenn diese erledigt sind. Die meisten herkömmlichen Netzwerkdienste sollten dies tun start on (local-filesystems and net-device-up IFACE!=lo).

SpamapS
quelle
3

Ich dachte, dass Upstart die Abwärtskompatibilität mit Init-Skripten im SysV-Stil beibehält /etc/init.d. Sie sollten in der Lage sein, Ihre Init-Skripte einfach unverändert zu verwenden.

Ryan C. Thompson
quelle
Es funktioniert, aber die Reihenfolge ist nicht mehr so ​​einfach vorherzusagen. Upstart-Jobs werden möglicherweise vor / nach der Ausführung Ihres Skripts rc2.d / S99mything gestartet. Sobald Sie von einem verwalteten Upstart-Service abhängig sind, benötigen Sie einen Upstart-Job.
SpamapS
2
Als Hack, könnten Sie Ihren Init - Skripte von bestimmten runlevels, entfernen und stattdessen ein paar Zeilen wie hinzufügen /etc/init.d/myservice startzu /etc/rc.local, in der richtigen Reihenfolge. Dadurch wird sichergestellt, dass Ihre Dienste nach allen anderen Diensten, einschließlich der von Upstart-Init-Skripten gestarteten Dienste, zuletzt gestartet werden.
Ryan C. Thompson