"exec kill -SIGINT" 이후 쉘스크립트 충돌 문제

"exec kill -SIGINT" 이후 쉘스크립트 충돌 문제

여기에서 찾은 쉘 스크립트를 수정했습니다. 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. 완전히 똑같지는 않지만 이 경우에는 충분히 비슷합니다.

관련 정보