プロセスをきれいに終了

プロセスをきれいに終了

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、--完了

これ模様通常、プロセス名のみが一致します。いつ- F一度設定すると、コマンドライン全体が使用されます。

あなたのスクリプトはled.pyおそらくPythonスクリプトなので、プロセス名は単にpythonpython3または類似)です。コマンドライン全体は似ている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
}

関連情報