프로세스를 깔끔하게 종료

프로세스를 깔끔하게 종료

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

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

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

시간을 보지 말고 스크립트를 start.sh시작하여 변경하려고 시도했지만 . 프로그램을 수동으로 시작한 다음 + 로 종료 하면 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]

pkillcrontab제공한 이름이 검색 중인 이름이 아니기 때문에 명령이 프로세스를 찾지 못할 수도 있습니다. ~에서pkill(1):

-f, --완료

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

귀하의 스크립트는 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
}

관련 정보