
Ich habe zwei Shell-Skripte namens first.sh und second.sh. Die Inhalte von first.sh und second.sh sind unten aufgeführt:
>>first.sh
#!/bin/bash
while true
do
echo The current time is $(date)
sleep(1)
done
>>second.sh
#!/bin/bash
while true
do
echo The current time from second script is $(date)
sleep(1)
done
Entsprechend lautet der Inhalt von first.service:
[Unit]
Description=first service
After=second.service
[Service]
ExecStart=/home/abanstola/first.sh
Der Inhalt von second.service ist:
[Unit]
Description=Second service
[Service]
ExecStart=/home/abanstola/second.sh
Beachten Sie den After=second.service
Code von first.service. Laut Dokumentation sollte der erste Dienst erst laufen, wenn der zweite Dienst gestartet ist. Aber selbst wenn ich den zweiten Dienst deaktiviere oder stoppe, läuft der erste Dienst ohne Probleme. Was mache ich hier falsch?
Antwort1
Sie haben die Dokumentation falsch gelesen.Zitat:
Wenn die Einheit
foo.service
die Einstellung enthältBefore=bar.service
und beide Einheiten werden gestartet,bar.service
wird der Start verzögert, bisfoo.service
der Startvorgang abgeschlossen ist.After=
ist das Gegenteil von Before=
Von mir hervorgehoben. Dies hat nur einen Effekt, wenn beide Einheiten gestartet werden. Wenn Sie eine davon deaktivieren, hat dies keine Auswirkung.
Es ist nicht ganz klar, was du eigentlich willst.
Die bessere Wahl ist wahrscheinlich:
Ähnlich wie
Wants=
, deklariert aber eine stärkere Anforderungsabhängigkeit. Abhängigkeiten dieses Typs können auch konfiguriert werden, indem ein symbolischer Link zu einem.requires/
Verzeichnis hinzugefügt wird, das der Unit-Datei beiliegt.Wenn diese Einheit aktiviert wird, werden auch die aufgelisteten Einheiten aktiviert. Wenn die Aktivierung einer der anderen Einheiten fehlschlägt und eine Reihenfolgeabhängigkeit
After=
von der fehlerhaften Einheit festgelegt ist, wird diese Einheit nicht gestartet. AußerdemAfter=
wird diese Einheit mit oder ohne Angabe von gestoppt, wenn eine der anderen Einheiten explizit gestoppt wird.
Konfiguriert Abhängigkeiten ähnlich zu
Requires=
, jedoch beschränkt auf das Stoppen und Neustarten von Einheiten. Wenn systemd die hier aufgelisteten Einheiten stoppt oder neu startet, wird die Aktion an diese Einheit weitergegeben. Beachten Sie, dass dies eine Einwegabhängigkeit ist – Änderungen an dieser Einheit wirken sich nicht auf die aufgelisteten Einheiten aus.