Wenn start.sh fertig ist, löscht systemd alles in derselben Kontrollgruppe wie start.sh
Ihre Optionen sind:
-
Einstellen von KillMode im Unit-Abschnitt zur Verarbeitung (der Standardwert ist control-group). Das bewirkt, dass systemd nur den Prozess beendet, den es direkt gestartet hat.
-
start.sh nicht dazu zu bringen, etwas im Hintergrund zu starten und zu beenden, sondern es direkt dort im Vordergrund auszuführen
Ich denke, in Ihrer Situation ist Option 2 praktikabel und unkomplizierter.
Quelle:https://unix.stackexchange.com/a/231201/45329
Obwohl der KillMode
geändert wird bis process
wie unten wird in Ihrer Situation funktionieren, es ist nicht die empfohlene Lösung.
[Service]
KillMode=process
...
Das Problem mit KillMode
auf process
setzen ist das systemd
verliert die Kontrolle über alle Kinder des Prozesses, den es gestartet hat. Das heißt, wenn irgendetwas passiert und einer Ihrer Prozesse aus irgendeinem Grund nicht stirbt, bleibt er weiterhin bestehen.
Eine bessere Lösung in Ihrer Situation wäre, alle Prozesse zu erstellen und ihre pid
beizubehalten und dann auf sie warten.
Der Wait-Befehl, den Sie in Ihrem Shell-Skript verwenden, kann je nach verwendeter Shell variieren (der von mir vorgeschlagene Link ist für Bash). Das Shell-Skript auf alle untergeordneten Elemente warten zu lassen, ist im Grunde dasselbe wie das Starten eines untergeordneten Elements, das nicht getrennt wird, im Vordergrund.
Also ungefähr so:
#!/bin/bash
# Start your various processes
process1 &
PROCESS1_PID=$!
process2 &
PROCESS2_PID=$!
process3 &
PROCESS3_PID=$!
# Wait on your processes
wait $PROCESS1_PID $PROCESS2_PID $PROCESS3_PID
# OR, if I'm correct, bash also allows you to wait on all children
# with just a plain wait like so:
wait
# reach here only after children 1, 2, and 3 died