Мне нужно сделать так, чтобы платформа 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
}