Mate um processo de forma limpa

Mate um processo de forma limpa

Eu preciso fazer com que a plataforma Linux Ubuntu inicie automaticamente e elimine um processo, por exemplo, se o horário for 8h, o processo inicia, se o horário for 19h, o processo é encerrado, e isso tem que ser todos os dias, e deve estar tudo bem, se o intervalo de tempo for ser fácil de mudar.

Estou tentando usar códigos simples no crontab:

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

Às vezes não olhe, já tentei alterá-los, start.shinicia led.pyo script, mas não consigo parar se estiver usando pkill -9 -f led.py. O processo é interrompido, mas os LEDs não apagam. Se eu iniciar manualmente o programa e depois matá-lo com Ctrl+ c, os LEDs serão desligados. Onde está o problema? Por que não consigo encerrar o processo e ao mesmo tempo desligar os LEDs?

Responder1

Quando você digita Ctrl+ c, isso geralmente envia ao processo um sinal "INT". Designal(7):

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

É comum que os processos instalem um manipulador para este sinal, permitindo-lhes realizar alguma limpeza antes de sair. No caso do seu led.pyscript, parece que esse manipulador desligou os LEDs.

Por padrão, pkillenvie killo sinal "TERM" (15). (Você também tentou enviar "KILL" (9).) Esses sinais faziam com led.pyque ele morresse de forma menos graciosa, sem ter a chance de executar sua função de finalização.

Para permitir led.pyum acabamento limpo, deverá enviar o sinal "INT" (2), com

pkill -2 [process specifier]

O pkillcomando em seu crontabtambém pode não ter encontrado o processo, porque o nome que você deu não era o que estava procurando. Depkill(1):

-f, --completo

Opadrãonormalmente só é comparado ao nome do processo. Quando-festiver definido, a linha de comando completa será usada.

Como seu script, led.pyprovavelmente era um script python, o nome do processo era simplesmente python(ou python3, ou similar). A linha de comando completa seria algo como python led.py, então as -fopções permitem combinar isso.

pkill -2 -f led.py

Responder2

Eu uso esta função há muitos anos:

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
}

informação relacionada