프로세스를 깔끔하게 종료

프로세스를 깔끔하게 종료

Linux Ubuntu 플랫폼이 자동으로 하나의 프로세스를 시작하고 종료하도록 해야 합니다. 예를 들어 시간이 오전 8시이면 프로세스가 시작되고 오후 7시이면 프로세스가 종료되며 매일 수행되어야 하며 시간 간격이 충분하다면 꽤 괜찮을 것입니다. 변경하기 쉽습니다.

crontab에서 간단한 코드를 사용하려고 합니다.

28 12 * * * /home/pi/Desktop/start.sh
50 11 * * * pkill led.py

시간을 보지 마십시오. 변경하려고 시도하고 스크립트를 start.sh시작했지만 . 프로세스가 종료되지만 LED는 꺼지지 않습니다. 프로그램을 수동으로 시작한 다음 + 를 사용하여 프로그램을 종료하면 LED가 꺼집니다. 문제는 어디에 있습니까? 왜 프로세스를 종료하고 동시에 LED를 끌 수 없습니까?led.pypkill -9 -f led.pyCtrlc

답변1

Ctrl+ 를 입력하면 c일반적으로 프로세스에 "INT" 신호가 전송됩니다. 에서signal(7):

  Signal     Value     Action   Comment
  ──────────────────────────────────────────────────────────────────────
  ...
  SIGINT        2       Term    Interrupt from keyboard

프로세스가 이 신호에 대한 핸들러를 설치하여 종료하기 전에 일부 정리를 수행하는 것이 일반적입니다. 스크립트 의 경우 led.py이 핸들러가 LED를 끈 것처럼 들립니다.

기본적으로 "TERM"(15) 신호를 보냅니다 pkill. kill(또한 "KILL"(9)을 보내려고 했습니다.) 이러한 신호는 led.py마무리 기능을 실행할 기회를 얻지 못한 채 덜 우아하게 종료되도록 했습니다.

깔끔하게 완료 하려면 led.py"INT"(2) 신호를 보내야 합니다.

pkill -2 [process specifier]

귀하가 제공한 이름이 검색 중인 이름이 아니기 때문에 pkill귀하의 명령이 프로세스 를 찾지 못했을 수도 있습니다. crontab에서pkill(1):

-f, --full

그만큼무늬일반적으로 프로세스 이름과만 일치합니다. 언제-에프설정되면 전체 명령줄이 사용됩니다.

귀하의 스크립트는 led.py아마도 Python 스크립트였을 것이므로 프로세스 이름은 간단하게 python(또는 python3또는 유사)였습니다. 전체 명령줄은 다음과 같으 python led.py므로 -f옵션을 사용하여 이에 일치시킬 수 있습니다.

pkill -2 -f led.py

답변2

나는 수년 전부터 이 기능을 사용했습니다.

function killit () {
for process in "$@"; do
    kill -0 $process &>/dev/null
    if [[ $? == 0 ]] ; then
        sudo kill $process #(sends a TERM, wait 5 seconds)
        sleep 5
        RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
        if [[ $RUNNING ]] ; then
            echo "$0 WARNING: process $process still running, trying kill again"
            sudo kill $process #(yes, try again, wait 5 seconds)
            sleep 5
            RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
            if [[ $RUNNING ]] ; then
                echo "$0 WARNING: process $process still running, trying kill -INT"
                sudo kill -INT $process  #(wait for it)
                sleep 5
                RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
                if [[ $RUNNING ]] ; then
                    echo "$0 WARNING: process $process still running, trying kill -INT again"
                    sudo kill -INT $process  #(damn, still not dead?)
                    sleep 5
                    RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
                    if [[ $RUNNING ]] ; then
                        echo "$0 WARNING: process $process still running, trying kill -KILL"
                        sudo kill -KILL $process #(same thing as -9)
                        sleep 5
                        RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
                        if [[ $RUNNING ]] ; then
                            echo "$0 WARNING: process $process still running, trying kill -KILL again"
                            sudo kill -KILL $process #(something is wrong)
                            sleep 5
                            RUNNING=$(ps aux | tr -s " " "\t" | cut -f 2 | grep $process)
                            if [[ $RUNNING ]] ; then
                                echo "$0 WARNING: Can't kill process $process"
                                logger "$0 WARNING: Can't kill process $process"
                            fi
                        fi
                    fi
                fi
            fi
        fi
    fi
done
}

관련 정보