
Я изменил скрипт оболочки, который нашел здесь: https://github.com/Slympp/ConanLinuxScript
Но у меня возникли проблемы с функцией "conan_stop". Скрипт просто завершается после
exec kill -SIGINT $pid
Скрипт успешно отправляет команду kill, но после этого он просто завершает работу без кода ошибки или чего-либо еще.
Все переменные в скрипте определены ранее в файле.
Полная функциональность
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
}
решение1
exec
заменяет оболочкус данной командой, как exec()
системный вызов. Когда команда ( kill
здесь , ) останавливается, оболочка больше не существует, поэтому нет возможности для продолжения выполнения скрипта.
Исключения составляют два случая: 1) когда exec
заданы перенаправления, в этом случае они просто применяются в текущей оболочке, и 2) когда команда не может быть выполнена, в этом случае exec
выдается ошибка и возвращается ложный код завершения.
Итак, exec kill ...
почти то же самое, что и kill ... ; exit
. Не совсем то же самое, но в данном случае достаточно близко.