Problema com o shellscript travando após “exec kill -SIGINT”

1

Eu modifiquei um script de shell que encontrei aqui: link

Mas estou tendo problemas com a função "conan_stop" O script termina apenas depois de

exec kill -SIGINT $pid

O script está enviando o comando kill com sucesso, mas depois disso ele termina sem nenhum código de erro ou qualquer coisa.

Todas as variáveis no script são definidas anteriormente no arquivo.

Função completa

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

}
    
por junkyhlm 29.05.2018 / 15:25

1 resposta

4

exec substitui o shell pelo comando fornecido, como exec() de chamada do sistema. Quando o comando (o kill , aqui) parar, o shell não existe mais, portanto não há como o script continuar.

As duas exceções são 1) quando exec recebe redirecionamentos, caso em que apenas os aplica no shell atual, e 2) quando o comando não pode ser executado, caso em que exec dá erro e retorna um código falsamente de saída.

Portanto, exec kill ... é quase o mesmo que kill ... ; exit . Não exatamente o mesmo, mas perto o suficiente neste caso.

    
por 29.05.2018 / 16:42