Meine Skripte cdist-deploy-to und cdist-mass-deploy (von cdist Konfigurationsverwaltung) werden interaktiv ausgeführt (dh werden von einem Benutzer aufgerufen).
Diese Skripte rufen viele Skripte auf, die wiederum einige Skripte aufrufen:
%Vor%Ich möchte alle Skripte beenden / beenden, sobald cdist-mass-deploy entweder vom Steuerelement C (SIGINT) gestoppt oder mit SIGTERM beendet wird.
cdist-deploy-to kann auch interaktiv aufgerufen werden und sollte das gleiche Verhalten aufweisen.
Wenn wir ps -ef ... und co-Varianten verwenden, um alle Prozesse mit dem ppid herauszufinden, sieht es so aus, als könnte es ziemlich unportabel sein. Verwenden von $! funktioniert nicht wie in den tieferen Ebenen die Kinder sind keine Hintergrundprozesse.
Ich habe versucht, den folgenden Code zu verwenden:
%Vor%Aber das führt zu hässlichen beendeten Nachrichten sowie zu einem segfault in den Shells (Dash, Bash, Zsh) und scheint sowieso nicht alles sofort zu stoppen:
%Vor%Die Frage ist also, wie man sauber alle (Unter) Kinder in einer tragbaren Weise verlassen kann (bourne shell, keine csh Unterstützung benötigt)?
Sie müssen nicht mit ^ C umgehen, was dazu führt, dass ein Signal an die gesamte Prozessgruppe gesendet wird, was alle Prozesse auslöschen wird, die nicht im Hintergrund sind. Sie müssen also INT nicht fangen.
Der einzige Grund, warum Sie einen Terminated erhalten, wenn Sie sie töten, ist, dass Kill TERM standardmäßig sendet, aber das ist vernünftig, wenn Sie einen TERM an erster Stelle behandeln. Sie könnten Kill -INT 0 verwenden, wenn Sie die Nachrichten vermeiden möchten.
(reagiert mit zusätzlichen Informationen)
Wenn die untergeordneten Prozesse im Hintergrund ausgeführt werden, können Sie ihre Prozess-IDs direkt nach dem Start erhalten, indem Sie die $! spezielle Shell-Variable. Sammeln Sie diese zusammen in einer Variablen und töten Sie sie alle, wenn Sie beenden müssen.
Tags und Links configuration shell posix