In Python geschriebene init.d-Skripte

10

Bei StackOverflow wurde eine Frage zum Schreiben von init.dSkripten in Python gestellt. Ein Kommentar gab an, dass diese Skripte in der Shell und nicht in Python programmiert werden sollten. Schreibt init.dSkripte in Python:

  1. Schlecht. Schlecht. Schlecht. Mach das niemals.
  2. Keine empfohlene Praxis.
  3. OK, mit Einschränkungen.
  4. Legacy-Dogma.
  5. Absolut in Ordnung.

Es wäre großartig, Alptraumszenarien zu kennen oder wenn diese Regel in das Blut eines Systemadministrators geschrieben ist.

mjhm
quelle

Antworten:

9

Ich würde # 2 sagen, aber sehr nahe an # 1 - "Schlecht. Schlecht. Schlecht. Mach das niemals." Der Standard für Linux-Init-Skripte, wie er ist, befindet sich im LSB , und obwohl er nie herauskommt und sagt "Dies sind Bourne-Shell-Skripte", werden mehrere Annahmen getroffen. Eine, dass Zeilen, die mit # beginnen, Kommentare sind, funktioniert einwandfrei. Problematischer ist die Anforderung, dass das Init-Skript die Befehle von /lib/lsb/init-functions"in der aktuellen Umgebung aus ausführen (siehe speziellen integrierten Befehlspunkt der Shell)".

Aber was noch wichtiger ist: Wenn Sie hier etwas wirklich Kompliziertes tun, machen Sie es falsch. Die Init-Skripte sollten sehr einfach und zweckmäßig sein. Sie sollten Skripte im klassischen Sinne sein, keine Programme. Es ist besser, es aufzusaugen und ein einfaches Shell-Skript zu erstellen, das jeder Systemadministrator auf einen Blick erstellen kann, als etwas Schönes und Entwickeltes in Python zu erstellen.

Eine weitere zu berücksichtigende Überlegung ist systemd, welche die Zukunft aller Systeminitialisierungen unter Linux sein kann oder nicht. Unter systemd erfolgt die Initialisierung eher über einfache Konfigurationsdateien als über Skripte. Die Idee ist, dass alle Startvorgänge in mehrere Standardentwurfsmuster passen und Sie eigentlich nur eines auswählen müssen. Wenn Ihr Programm etwas Kompliziertes für die Initialisierung verwendet, sollte dies außerhalb des Init-Skripts selbst liegen.

mattdm
quelle
1
Ich gehe mit dieser Antwort. Der Punkt ist, dass Python nicht notwendig und nicht Standard ist und als solches einen zusätzlichen Punkt für das Debuggen von Unsicherheit und einen zusätzlichen Punkt für Fehler schaffen kann. In Bezug auf die ursprüngliche SO-Frage stelle ich fest, dass solche Skripte Dämonen starten können, aber sie sollten nicht die tatsächlichen Dämonen sein.
mjhm
Wenn ich mich erinnere, folgen nicht alle Distributionen LSB. siehe debian.
Massimo
10

Ich sehe kein Problem damit, wenn Sie sicher wissen, dass der Python-Interpreter verfügbar sein wird, wenn das Skript init.d ausgeführt wird. Dies bedeutet für mich, dass Sie sich etwas ansehen, das relativ spät in einer Mehrbenutzer-Run-Ebene (oder "Grafikkonsole") ausgeführt wird.

Dies bedeutet jedoch, dass eine bestimmte Version des Python-Interpreters für Ihre Startsequenz von entscheidender Bedeutung sein kann. Dies ist eine weitere Version, die Sie bei Upgrades überprüfen müssen.

Ich denke, das bedeutet, dass ich "3. OK, mit Vorbehalten" sage.

Vatine
quelle
4
+1. Genau das, was ich geschrieben habe. Die einzigen "Probleme" hier wären, sicherzustellen, dass Sie sich an LSB halten (z. B. die erforderlichen Funktionen bereitstellen) und dass der benötigte Python-Interpreter zur Laufzeit verfügbar ist (und nicht defekt ist)
Sam Halicke,
3
Die zur Laufzeit verfügbare Version kann kompliziert sein, wenn der Benutzer / usr auf einer separaten Partition ausgewählt hat. Es ist wichtig, dass Ihr Skript nach dem Mounten von / usr ausgeführt wird, da Python normalerweise in / usr installiert ist.
Zoredache
@ Zoredache - Ayup. Normalerweise wissen Sie, dass "passiert" ist, wenn Sie zu spät in der RC-Sequenz "Mehrbenutzer" sind.
Vatine
2

Ich stimme "3. OK, mit Vorbehalten" zu, aber aus verschiedenen Gründen. Meine Erfahrung mit Solaris war, dass sie für einige ihrer internen Programme eine Betriebssystemkopie von Perl hatten. Das Shell-Skript war nichts anderes als die Shell, mit der Perl gestartet werden konnte. Musste das Startskript in sh geschrieben werden? Nein, aber es hat die Wartbarkeit für den Administrator verbessert. Und das Init-Skript hat nichts komplizierteres gemacht als daemon --startoder daemon --stop. Wenn Sie dies getan haben, können reguläre Benutzer Ihr Tool im nicht privilegierten Modus starten, wenn dies im Kontext Ihres Programms sinnvoll ist. Und sie müssten nicht alle möglichen komplizierten Einstellungen haben, um Finesse zu üben.

Moderne Linux-Distributionen, auch solche, die noch verwendet werden init.d, verfügen über eine große Sammlung vorgefertigter Funktionen, die die Verwaltung von Daemons vereinfachen sollen. Grafische Startvorgänge nutzen diese Funktionen routinemäßig, um das hübsche Logo aufrechtzuerhalten, es sei denn, eines der Startskripte führt zu Fehlern. Ihr Python-Code (oder eine andere Sprache) spielt möglicherweise nicht gut mit diesen Schemata.

Wenn Sie sich nicht für Ästhetik oder Wartbarkeit interessieren, kann Ihr Init-Skript so geschrieben werden, wie Sie möchten. Ich habe viele Administratoren gesehen, die nicht einmal richtig ausschneiden und einfügen können, Befehlszeilenargumente vollständig ignorieren und einfach den Dämon starten. Kein Herunterfahren, Status oder Neustart. Es war unreif, aber ihr Code lief noch.

Zerolagtime
quelle
1

Ich sage zwischen # 1-2. Das LSB weist Sie auf diese Weise an. Von einem Sys-Admin (Nicht-Entwickler-Rolle) diktiert die Jobanforderung das Sh / Bash-Wissen, NICHT das Dev-Level (oder sogar das leichte Verständnis) von Python, PHP oder Perl. Das gilt für den LAMP-Stack, nicht für die System-Init-Skripte.

Wochen
quelle