乾淨地殺死進程

乾淨地殺死進程

我需要讓Linux Ubuntu平台自動啟動並殺死一個進程,例如,如果時間是早上8點進程啟動,如果時間是晚上7點進程被殺死,而且必須每天都這樣,應該沒問題,如果時間間隔容易改變。

我嘗試在 crontab 中使用簡單的程式碼:

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

不要看時間,我嘗試過更改它們,start.sh啟動led.py腳本,但如果我使用pkill -9 -f led.py.該進程已終止,但 LED 不會關閉。如果我手動啟動程序,然後用Ctrl+終止它c,LED 就會關閉。哪裡有問題?為什麼我不能終止進程並同時關閉 LED?

答案1

當您鍵入Ctrl+時c,通常會向進程發送“INT”訊號。從signal(7):

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

進程通常為此訊號安裝一個處理程序,允許它們在退出之前執行一些清理操作。就您的腳本而言led.py,聽起來該處理程序關閉了 LED。

預設情況下,pkill發送kill“TERM”(15)訊號。 (您也嘗試發送“KILL”(9)。)這些訊號導致當led.py機不太優雅,沒有機會運行其整理功能。

為了led.py乾淨地完成,您應該發送“INT”(2)信號,

pkill -2 [process specifier]

pkill您的命令也crontab可能無法找到該進程,因為您提供的名稱不是它正在搜尋的名稱。從pkill(1):

-f,--完整

圖案通常僅與進程名稱相符。什麼時候-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
}

相關內容