Sie können nur einen Job im Vordergrund haben. Sie können Ihr Skript so reagieren lassen, dass es auf jedes Signal reagiert, das es erreicht, und das Signal an andere Jobs weiterleitet. Sie müssen sicherstellen, dass Ihr Skript in der Nähe bleibt, wenn Sie eine zentrale Möglichkeit haben möchten, die Unterprozesse zu beenden: Rufen Sie wait
auf, damit Ihr Skript nicht beendet wird, bis alle Jobs gestorben sind oder das Skript selbst getötet wird.
#!/bin/bash
jobs=
trap 'kill -HUP $jobs' INT TERM HUP
myscript1.sh & jobs="$jobs $!"
myscript2.sh & jobs="$jobs $!"
wait
Sie können das Wrapper-Skript immer noch nur töten, indem Sie ihm ein Signal senden, das es nicht einfängt, wie z.B. SIGQUIT (das ich absichtlich weggelassen habe) oder SIGKILL (der nicht eingefangen werden kann).
Es gibt einen Weg, alle Prozesse im Vordergrund zu haben: Verbinden Sie sie durch Pipes. Ignorieren Sie SIGPIPE, damit der Tod eines Prozesses nicht den vorherigen tötet. Speichern und stellen Sie stdin und stdout über andere Dateideskriptoren wieder her, wenn Sie sie benötigen. Auf diese Weise werden das Skript und die Hintergrundaufgaben in derselben Prozessgruppe sein, sodass das Drücken von Strg+C sowohl das Wrapper-Skript als auch die Unterprozesse beendet. Wenn Sie das Wrapper-Skript direkt beenden, hat dies keine Auswirkungen auf die Unterprozesse; Sie können stattdessen die Prozessgruppe beenden, indem Sie das Negative der PID des Wrapper-Skripts übergeben (z.B. kill -TERM -1234
).
trap '' PIPE
{
myscript1.sh <&3 >&4 |
myscript2.sh <&3 >&4
} 3<&0 4>&1