
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
exec
ersetzt die Schalemit dem angegebenen Befehl, wie der exec()
Systemaufruf. Wenn der Befehl ( kill
hier das ,) beendet wird, existiert die Shell nicht mehr, sodass das Skript nicht fortgesetzt werden kann.
Die beiden Ausnahmen sind 1) wenn exec
Umleitungen 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 exec
tritt 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.