Ich würde gerne wissen, ob es eine Möglichkeit gibt Systemd
, neu zu starten A.service
( After
), wenn B.service
Sie gestartet oder neu geladen werden (nur Konfiguration neu laden), wenn möglich ohne Bearbeitung, B.service
die vom System installiert und aktualisiert wird.
A.service
sollte starten, auch wenn B.service
nicht installiert, deaktiviert oder gestoppt.
A.service
:
[Unit]
After = B.service network-online.target
Wants = B.service
[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes
[Install]
WantedBy = network-online.target
B.service
:
[Unit]
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid
[Install]
WantedBy=multi-user.target
Overriding vendor settings
nachgeforscht, aber das sieht noch einfacher und vielversprechender aus. Nur, dass ich nichtA
aufhören möchte , wenn ichB
aufhöre, nurA.restart
wennB.start
, trotzdem werde ich bald einen Test machen und sehen, ob es eine Möglichkeit gibt, es zu handhaben werden Sie wissen lassenPartOf
undRestart=always
zusammen benutzt?Restart=
Dokumentation an, ich bin mir nicht sicher, wie sich dieoneshot
Dienste verhalten , aber unabhängig davon:When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restarted
Wenn ich richtig verstehe, würde das manuelle Stoppen von B A stoppenPartOf
ist aber keine Lösung für die Frage, trotzdem viel Spaß.PartOf
mitRestart=always
? Hast du das versucht?Ich hatte keine Kontrolle über
stop
mitPartOf=
undA
muss nicht aufhören mitB
, so dass ich am Ende die Einstellungen des Anbieters überschreiben verwendet habe , scheint zu funktionieren./etc/systemd/system/B.service.d/override.conf
/cmd
Die Implementierung ist asynchron und greift auf eine Ressource/script.sh
zu, auf die auch zugegriffen werden muss. Ich habe (vorerst) nichts Besseres gefunden, als ein paar Sekunden zu schlafen.Ich habe versucht,
systemctl [--no-block] try-restart
vor der Verwendung/script.sh
direkt zu verwenden, aber nicht funktioniert.quelle
man systemd.unit
(oder suche es online, wenn es nicht installiert ist) und suche im Kapitel "Übergeordnete Herstellereinstellungen".Derzeit deckt systemd dieses Szenario nicht ab. Sie können diese Funktionalität nicht allein durch Servicedateien erreichen. Eine Möglichkeit besteht darin, systemctl über ein gleichnamiges Shell-Skript zu hijacken und dabei zu prüfen, ob B.service gerade neu gestartet oder geladen wird, die entsprechende Aktion auch mit A.service durchzuführen und bei Bedarf das zu aktualisieren rc.local, um auch beim Booten in den richtigen Zustand zu gelangen. Ich habe dieses Problem mit docker.service und networking.service, starte sie aber immer zusammen neu:
Offensichtlich wäre dies nicht effektiv, wenn das System selbst B.service intern manipulieren würde (z. B. über andere Servicedateien).
quelle