Ich kann auf systemd einige lokale Skripte (oder sehr lokale Befehle) nicht korrekt ausführen. Ich weiß bereits, dass ich keinen Dienst (in systemd eine Einheit) für diese Art von Skripten erstellen darf (oder muss ich?).
Die Problemumgehung, die ich gefunden habe, besteht darin, rc.local zu erstellen und ihm Ausführungsberechtigungen zu erteilen.
printf '#!/bin/bash \n\nexit 0' >/etc/rc.local
chmod +x /etc/rc.local
Wenn ich zum Beispiel einen Legacy-Server mit einer von Ihnen konfigurierten einfachen rc.local bekomme, weiß ich, was Sie getan haben und wie sehr es wehtun wird, etwas Neues in der Distribution zu aktualisieren oder zu installieren, da rc.local von external respektiert wurde Pakete, aber auf der anderen Seite, wenn ich einen Server installiere und eine systemd-Einheit oder zwei oder drei (oder sogar sysvinit-Dienste) erstelle, nur um eine einfache Aufgabe zu erledigen, kann dies manchmal Ihr Leben erschweren und viel mehr als dies meine Einheiten Namen können eines Tages zu Konflikten mit den Namen der neuen Dienste führen, die von der Distributionsentwicklung erstellt und möglicherweise bei einem Upgrade installiert wurden, was zu Problemen bei meinen Skripten führen kann!
Ich sehe eine andere Frage zu fragen , wo ist rc.local und die Antwort war , um es zu erstellen und Ausführungsberechtigungen zu geben, ich glaube , meine Frage ist wirklich nicht ein Duplikat , weil ich möchte nicht wissen , wo es ist - glauben Sie mir, ich will nur zu akzeptieren, dass es veraltet ist , aber ich kann nicht den richtigen Weg finden, um solche Dinge zu tun, sollte ich wirklich eine Einheit nur für solche einfachen Dinge schaffen?
Antworten:
Wie bereits an anderer Stelle erwähnt, wird es mäßig unrein,
rc-local.service
unter zu verwendensystemd
.poweroff
/reboot
-Befehle entfernt, die viele Leute verwenden).rc-local.service
eine Möglichkeit, aber Debian bietet eine Drop-In-Datei, die mindestens eine wichtige Einstellung ändert.rc-local.service
kann oft gut funktionieren. Wenn Sie sich darüber Sorgen machen, müssen Sie nur eine eigene Kopie davon erstellen! Hier ist die Magie:Ich glaube nicht, dass Sie jedes einzelne Detail verstehen müssen [*], aber es gibt zwei Dinge, die Sie hier wissen müssen.
Sie müssen dies mit aktivieren
systemctl enable my-startup.service
.Wenn Ihr Skript von einem anderen Dienst abhängig ist, einschließlich
network-online.target
, müssen Sie ihn deklarieren. ZB einen[Unit]
Abschnitt hinzufügen , mit den LinienWants=network-online.target
undAfter=network-online.target
.Sie müssen sich keine Gedanken über Abhängigkeiten von "Early Boot" -Diensten machen - insbesondere von Diensten, die bereits zuvor bestellt wurden
basic.target
. Dienstleistungen wiemy-startup.service
werden automatisch nachbestelltbasic.target
, sofern sie nicht eingestellt sindDefaultDependencies=no
.Wenn Sie nicht sicher sind, ob es sich bei einer Ihrer Abhängigkeiten um einen "Early Boot" -Dienst handelt, besteht ein Ansatz darin, die zuvor geordneten Dienste
basic.target
durch Ausführen aufzulistensystemctl list-dependencies --after basic.target
. (Beachten Sie, das--after
ist nicht--before
).Es gibt einige Überlegungen, die meiner Meinung nach auch für Pre-Systemd gelten
rc.local
:rc.local
.[*] Ich habe
Type=oneshot
+ verwendet,RemainAfterExit=yes
weil es für die meisten One-Shot-Skripte sinnvoller ist. Es wird formalisiert, dass Sie eine Reihe von Befehlen ausführen, diemy-startup
nach Abschluss als "aktiv" angezeigt werden und dass Sie keinen Dämon starten.quelle
.service
sein, oder wenn Sie wirklich ein LSB-Init-Skript schreiben möchten, können Sie dies stattdessen tun. Ich wollte nicht empfehlen, mehrere Daemonsrc-local.service
oder ein gleichwertiges Element hinzuzufügen. Ich denke, es funktioniert wahrscheinlich, aber es scheint viel besser zu sein, wenn Sie den einzelnen Daemonsystemctl restart my-daemon
wie alles andere neu starten können. Es ist beabsichtigt, dass Sie Ihre lokalen Dienste in setzen/etc/systemd/system
.local-
...Type=oneshot
... es formalisiert, dass ... Sie keinen Daemon starten werden. Wenn Sie Informationen zum Starten eines Daemons benötigen, stellen Sie eine neue Frage.Vergiss es
rc.local
.Wie gesagt zu CentOS 7 und zu Debian 8 und zu Ubuntu 15 :
Sie verwenden ein systemd + Linux-Betriebssystem.
/etc/rc.local
ist ein doppelter Abwärtskompatibilitätsmechanismus in systemd, da es sich um einen Abwärtskompatibilitätsmechanismus für einen Mechanismus handelt, der selbst ein Kompatibilitätsmechanismus imrc
Klon von van Smoorenburg System 5 war .Die Verwendung
/etc/rc.local
kann schrecklich schief gehen. Die Leute waren überrascht über die Tatsache, dass systemd nichtrc.local
ganz auf die gleiche Weise läuft , an der gleichen Stelle im Bootstrap, wie sie es gewohnt sind. (Oder fälschlicherweise erwartet: Es lief nicht zuletzt auf dem alten System, wie das OpenBSD-Handbuch immer noch feststellt.) Andere waren überrascht, dass das, was sie bei derrc.local
Erwartung der alten Art und Weise, Dinge zu tun, eingerichtet haben, ist dann vollständig durch die Gleichen von neuen rückgängig gemachtudev
Regeln, Networkmanagersystemd-logind
,systemd-resolved
oder verschiedene „Kit“ s.Wie am Beispiel von „ Excess Argumenten‚auf Arch installieren? Warum `init 0 'in Folge‘ “, bereits einige Betriebssysteme systemd bieten , ohne die Abwärtskompatibilität verfügt wie der
systemd-rc-local-generator
Generator . Während Debian die Abwärtskompatibilitätsfunktionen beibehält , erstellt Arch Linux systemd mit deaktivierten Funktionen . Also auf Arch und Betriebssystemen wie es erwarten/etc/rc.local
, völlig ignoriert zu werden .Vergiss es
rc.local
. Es ist nicht der richtige Weg. Sie haben ein systemd + Linux-Betriebssystem. Stellen Sie also eine ordnungsgemäße System-Service-Einheit her und beginnen Sie nicht an einem Punkt, der zwei Ebenen der Abwärtskompatibilität entfernt ist. (Auf Ubuntu und Fedora, es ist drei mal entfernt, das van Smoorenburg System 5 -rc
Klon, gefolgtrc.local
dann gewesen sich zweimal überholt, vor über einem Jahrzehnt, die zuerst von Emporkömmling und dann von systemd.)Denken Sie auch an die erste Regel für die Migration zu systemd .
Dies ist nicht einmal eine neue systemd-spezifische Idee. Auf van Smoorenburg-
rc
und Upstart-Systemen musste statt der Verwendung ein ordnungsgemäßes van Smoorenburg-rc
Skript oder eine Upstart- Jobdatei erstellt werdenrc.local
. Sogar das Handbuch von FreeBSD stellt fest, dass man heutzutage ein richtiges Mewburn-rc
Skript erstellt, anstatt es zu verwenden/etc/rc.local
. Mewburnrc
wurde 2000 von NetBSD 1.5 eingeführt./etc/rc.local
stammt aus der Zeit von Seventh Edition Unix und früher. Es wurde von AT & T Unix System 3 (mit einem etwas anderen in AT & T Unix System 5) im Jahr 1983 abgelöst/etc/inittab
und auf Runlevel-Basis . Auch das ist jetzt Geschichte.rc
/etc/inittab
Erstellen Sie geeignete native Service-Definitionen für Ihr Service-Management-System, sei es ein Service-Bundle für das nosh-Toolset
service-manager
undsystem-control
ein/etc/rc.d/
Skript für Mewburnrc
, eine Service-Unit-Datei für systemd, eine Job-Datei für Upstart oder ein Service-Verzeichnis für runit / s6 / daemontools -encore oder sogar ein/etc/init.d/
Drehbuch für van Smoorenburgrc
.In systemd gehen solche vom Administrator hinzugefügten Service-Unit-Dateien
/etc/systemd/system/
normalerweise (oder/usr/local/lib/systemd/system/
selten) ein. Mit dem nosh Service Manager/var/local/sv/
ist ein herkömmlicher Ort für lokale Service-Bundles. Mewburnrc
unter FreeBSD verwendet/usr/local/etc/rc.d/
. Gepackte Service-Unit-Dateien und Service-Bundles, falls Sie sie erstellen, befinden sich jedoch an verschiedenen Orten.Weitere Lektüre
rc.local
. FreeBSD System Manager-Handbuch . 2016-04-23./etc/rc.local
oderchmod -x
es . Redhat-Fehler # 734268.rc.local
fängt zu früh an . Systemfehler # 7703rc.local
. bencane.com./etc/inittab
gehört der Vergangenheit an. . Häufig gestellte Fragen.systemd.unit
" Fehlende System - Suchpfade auf der Handbuchseite ". Errata für systemd doco . Häufig gestellte Fragen.quelle
Zusammenfassung von https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
Erstellen Sie /etc/systemd/system/rc-local.service:
Dann:
Erkundigen Sie sich bei:
quelle
StandardOutput=journal+console
(Konsole entspricht in Ihrem Beispiel tty) scheint für die Fehlerbehebung viel nützlicher zu sein. Auch die Unterstützung fürSysVStartPriority=
wurde irgendwann entfernt. Vielleicht können Sie kommentieren, wie wichtig esSysVStartPriority=
ist, oder es entfernen. Abgesehen davon ist es eine anständige Antwort.