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.sh
inicia led.py
o 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.py
script, parece que esse manipulador desligou os LEDs.
Por padrão, pkill
envie kill
o sinal "TERM" (15). (Você também tentou enviar "KILL" (9).) Esses sinais faziam com led.py
que ele morresse de forma menos graciosa, sem ter a chance de executar sua função de finalização.
Para permitir led.py
um acabamento limpo, deverá enviar o sinal "INT" (2), com
pkill -2 [process specifier]
O pkill
comando em seu crontab
també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.py
provavelmente 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 -f
opçõ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
}