Аккуратно завершить процесс

Аккуратно завершить процесс

Мне нужно сделать так, чтобы платформа 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. Процесс убивается, но светодиоды не выключаются. Если я вручную запускаю программу, а затем убиваю ее с помощью Ctrl+ c, светодиоды выключаются. В чем проблема? Почему я не могу убить процесс и одновременно выключить светодиоды?

решение1

Когда вы вводите Ctrl+ c, это обычно посылает процессу сигнал «INT».signal(7):

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

Обычно процессы устанавливают обработчик для этого сигнала, что позволяет им выполнить некоторую очистку перед выходом. В случае вашего led.pyскрипта, похоже, этот обработчик выключил светодиоды.

По умолчанию pkillи killотправляет сигнал "TERM" (15). (Вы также пытались отправить "KILL" (9).) Эти сигналы заставляют led.pyумирать менее изящно, не давая возможности выполнить свою завершающую функцию.

Чтобы led.pyзакончить чисто, следует подать сигнал "INT" (2), при этом

pkill -2 [process specifier]

Команда pkillв вашем файле crontabтакже могла не найти процесс, поскольку указанное вами имя не совпадало с тем, которое искала команда.pkill(1):

-ф, --полный

Theшаблонобычно сопоставляется только с именем процесса. Когдаустановлен, используется полная командная строка.

Поскольку ваш скрипт, 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
}

Связанный контент