Die folgende Sequenz gibt mir den Rückgabewert des ersten Befehls, nicht des zweiten, wie ich erwartet hätte (unabhängig davon, ob ich den ersten Befehl in einer Subshell ausführe):
sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;
(sudo systemctl start x); sudo systemctl is-active --quiet x; echo $?;
Der Dienst x
ist defekt und konnte nicht gestartet werden - er läuft also nicht. Der folgende Befehl, der eigenständig ausgeführt wird, gibt mir einen korrekten Rückgabewert, 3
wie er sein sollte:
sudo systemctl is-active --quiet x; echo $?;
Warum erhalte ich 0
beim Ausführen den Rückgabewert des ersten Befehls ( ) command; command; echo $?
anstelle des Rückgabewerts ( 3
) des zweiten mit echo $?
?
Ich bin dran GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
. Ich weiß, dass es funktioniert, wenn ich es in zwei Zeilen aufteile:
sudo systemctl start x;
sudo systemctl is-active --quiet x; echo $?;
Aber ich muss es als Einzeiler haben, da ich es in die PHP- shell_exec()
Funktion stecke . Das zweimalige Ausführen shell_exec()
hat das gleiche Ergebnis wie das Einfügen der Befehle in eine Zeile.
quelle
sd_notify
Socket verwenden, um den Starterfolg selbst zu melden, sogar mehr. Das heißt, es ist durchaus möglich sicherzustellen, dass systemd weiß, wann ein Dienst tatsächlich erfolgreich initialisiert wurde. Es braucht nur etwas zusätzlichen Code.sd_notify
Information - leider pflege ich die Quelldateien nicht. Deshalb ist es einfacher zu bedienensleep
und abzuwarten, was passiert :)Versuche dies:
Dadurch
&&
wird das System gezwungen, die Befehle der Reihe nach auszuführen, und zwar nur dann, wenn der vorherige Befehl erfolgreich ausgeführt wurde.quelle
is-active
true zurückgegeben wird, aber dann stirbt. Wie andere vorgeschlagen haben, ist es besser, zwischen den beidensystemctl
Anrufen eine kurze Verzögerung von ein oder zwei Sekunden einzufügen .