Bash-Prozesse „auf nette Art“ beenden

Bash-Prozesse „auf nette Art“ beenden

Ich versuche kill -9aus den im Folgenden beschriebenen Gründen zu vermeiden,Nutzlose Verwendung des Kill -9-SerienbriefsReicht diese Funktion aus oder muss ich die killProzesse nach einem Timeout beenden oder noch auf andere Feinheiten achten?

soft_kill()
{
    # Try to avoid forcing a kill
    # @param $1: PID
    kill $1 || kill -INT $1 || kill -HUP $1 || \
    (echo "Could not kill $1" >&2; kill -KILL $1)
}

Abgesehen davon, was wäre ein besserer Name für diese Funktion? Der aktuelle Name erinnert mich an „Killing Me Softly“ und manslaughterklingt ein bisschen streng. Vielleicht spoon_kill(googeln Sie es)?

Antwort1

Ihr Soft_kill hat ein paar Probleme.

  • Das Beenden eines Prozesses erfolgt nicht sofort, aber kill wird beendet, sobald das Signal gesendet wird. Sie müssen eine Weile warten, bevor Sie feststellen können, ob der Kill-Befehl erfolgreich war oder ob Sie auf -INT oder -HUP eskalieren müssen.
  • Kill-Rückkehr(1)Null (Erfolg), wenn das Senden des Signals zulässig ist. Nicht, wenn es gelingt, den Prozess zu beenden. In Ihrem Code wird also nur der erste Kill ausgeführt.

(1)

töten()
RÜCKGABEWERTE
Bei Erfolg gibt kill() den Wert 0 zurück. Bei einem Fehler gibt es den Wert -1 zurück, sendet kein Signal und setzt errno auf einen der folgenden Werte:

EINVAL
Der Wert von sig ist eine ungültige oder nicht unterstützte Signalnummer.

EPERM
Die Benutzer-ID des sendenden Prozesses ist nicht privilegiert; seine tatsächliche oder effektive Benutzer-ID stimmt nicht mit der tatsächlichen oder gespeicherten Benutzer-ID des empfangenden Prozesses überein. Oder der Prozess hat keine Berechtigung, das Signal an einen empfangenden Prozess zu senden.

ESRCH
Es kann kein Prozess bzw. keine Prozessgruppe gefunden werden, die dem von pid angegebenen entspricht.

Antwort2

terminate () {
    # accepts PID as $1, defaults to current process
    local signals=(TERM INT QUIT HUP KILL) s=0 process=${1:-$$}
    local signal_qty=${#signals[@]}

    while pgrep $process >/dev/null
    do
        signal=${signals[s]}
        [[ $signal = KILL ]] && echo "Attempting to force kill it." >&2
        kill -$signal $process
        (( ++s >= signal_qty )) && { echo "It won't die." >&2; return 1; }
        sleep 1
    done
}

verwandte Informationen