Problem mit Shellscript-Absturz nach „exec kill -SIGINT“

Problem mit Shellscript-Absturz nach „exec kill -SIGINT“

Ich habe ein Shell-Skript geändert, das ich hier gefunden habe: https://github.com/Slympp/ConanLinuxScript

Aber ich habe Probleme mit der Funktion "conan_stop" Das Skript wird einfach beendet nach

exec kill -SIGINT $pid

Das Skript sendet den Kill-Befehl erfolgreich, wird danach aber ohne Fehlercode oder ähnliches beendet.

Alle Variablen im Skript werden zuvor in der Datei definiert.

Volle Funktion

function conan_stop {

pid=$(ps axf | grep ConanSandboxServer-Win64-Test.exe | grep -v grep | awk '{print $1}')

if [ -z "$pid" ]; then
        echo "[$(date +"%T")][FAILED] There is no server to stop"
else
    if [ "$discordBotEnable" = true ]; then
        echo "[$(date +"%T")][SUCCESS] Discord bot is enabled"
        if [ -n "$botToken" ] && [ -n "$channelID" ]; then
            secLeft=$(($delayBeforeShutdown * 60))

            while [ $secLeft -gt "0" ]; do
                minLeft=$(($secLeft / 60))
                echo "[$(date +"%T")][WAIT] Server will be shut down in $minLeft minutes"
                python3 $discordScript $botToken $channelID "Servern kommer stängas ner om " $minLeft "minuter."
                secLeft=$(($secLeft - 60))
                sleep 60
            done
            python3 $discordScript $botToken $channelID "Servern stängs nu ner."
        else
            echo "[$(date +"%T")][ERROR] No Discord botToken or channelID found"
        fi
    fi

        echo "[$(date +"%T")][SUCCESS] Existing PIDs: $pid"
        exec kill -SIGINT $pid

        isServerDown=$(ps axf | grep ConanSandboxServer-Win64-Test.exe | grep -v grep)
        cpt=0
        while [ ! -z "$isServerDown" ]; do
                echo "[$(date +"%T")][WAIT] Server is stopping..."
                ((cpt++))
                sleep 1
                isServerDown=$(ps axf | grep ConanSandboxServer-Win64-Test.exe | grep -v grep)
        done
        echo "[$(date +"%T")][SUCCESS] Server stopped in $cpt seconds"

        if [ "$discordBotEnable" = true ]; then
                echo "[$(date +"%T")][SUCCESS] Discord bot is enabled"
                if [ -n "$botToken" ] && [ -n "$channelID" ]; then
                        python3 $discordScript $botToken $channelID "Servern stängdes ner efter $cpt sekunder."
                else
                        echo "[$(date +"%T")][ERROR] No Discord botToken or channelID found"
                fi
        fi
fi

}

Antwort1

execersetzt die Schalemit dem angegebenen Befehl, wie der exec()Systemaufruf. Wenn der Befehl ( killhier das ,) beendet wird, existiert die Shell nicht mehr, sodass das Skript nicht fortgesetzt werden kann.

Die beiden Ausnahmen sind 1) wenn execUmleitungen angegeben werden. In diesem Fall werden sie einfach in der aktuellen Shell angewendet, und 2) wenn der Befehl nicht ausgeführt werden kann. In diesem Fall exectritt ein Fehler auf und ein falscher Exit-Code wird zurückgegeben.

Ist also exec kill ...fast dasselbe wie kill ... ; exit. Nicht genau dasselbe, aber in diesem Fall nah genug dran.

verwandte Informationen