Я добавил небольшой фрагмент.
С помощью переменной TRIGGER
вы можете выбрать дату, когда скрипт (cron.sh
или в вашем случае курс cron.py
) должен быть запущен в первый раз.
WAIT
определяетпромежуток между запуском скрипта (cron
) и следующим запуском (например, 5 минут или 24 часа ). В моем примере я просто жду 5 минут до следующегоrun.
Затем мы проверяем, существует ли идентификатор процесса запущенного скрипта cron.sh
и реагируем на это:
- PID недоступен и возвращаемое значение не равно нулю: нам нужноперезапустите скрипт. Произошла ошибка.
- PID недоступен, а возвращаемое значение равно нулю: увеличить значение триггера (время ожидания). Нет ошибок.
Обратите внимание, что это только подход, очень быстрый и грязный. Это должно только продемонстрировать, как это можно сделать. Вы можете воспользоваться этим и реализовать свои собственные функции сейчас (уведомления, ведение журнала и т. Д.)
Дополнительно:
Вы можете проверить, как часто выполнялся cron-скриптначалось. Например, установите предел для перезапуска cron. Если cron-скрипт дает сбой несколько раз подряд, вы должны деактивировать это и уведомить об этом пользователя.
Если вы хотите получать уведомления в случае сбоя вашего скрипта несколько раз, я личнонапример, опция отправки почты: Отправить почту через терминал
Работая с массивами и циклами, можно отслеживать более одного Python- или bash-скрипта.
#!/usr/bin/bash
# Select how long between each run should be waited
WAIT="5 minutes"
process_started=false
tmp_pid=0
# For starting a detached process
startProcess() {
./cron.sh &>/dev/null &
tmp_pid=$(echo $!)
process_started=true;
return 0
}
# Make the current date to the staring point
TRIGGER=$(date +'%d-%m-%y-%H-%M')
echo "Starting Point: $TRIGGER"
while true
do
# Check for the trigger
if [ $(date +'%d-%m-%y-%H-%M') = "$TRIGGER" ]; then
# No process has been stared. Start the proces now
if [ "$process_started" = false ]; then
startProcess
echo "Started script: " $(date +'%d-%m-%y %H:%M:%S') " (PID $tmp_pid)"
fi
# Check for existence
if ! kill -0 $tmp_pid > /dev/null 2>&1; then
echo "No process found with pid $tmp_pid" >&2
# Now, no process has been found.
# We can check of the exit code to determine
# if the process has exited normally
wait ${tmp_pid}
if [ $? -eq 0 ]; then
echo "Script exited normal: " $(date +'%d-%m-%y %H:%M:%S')" . Waiting another $WAIT"
# Process has been exited normally.
# Resetting the trigger.
TRIGGER=$(date +'%d-%m-%y-%H-%M' -d "$WAIT")
echo "New run in $WAIT: $TRIGGER"
else
echo "Script exited with an error"
# Here. e. g. Start the script again
startProcess
echo "Retarted script: " $(date +'%d-%m-%y %H:%M:%S') " (PID $tmp_pid)"
fi
fi
sleep 1s
fi
done
Это, конечно, также работает со скриптом Python. Просто измените функцию startProcess
:
startProcess() {
./cron.py &>/dev/null &
tmp_pid=$(echo $!)
process_started=true;
return 0
}
и не забудьте включить #!/usr/bin/env python3
в ваш файл cron.py
.
со следующим cron.sh
x=1
while [ $x -le 5 ]
do
x=$(( $x + 1 ))
sleep 1s
done
exit 0
вы получите вывод:
Starting Point: 20-10-19-05-22
Started script: 20-10-19 05:22:36 (PID 86402)
No process found with pid 86402
Script exited normal: 20-10-19 05:22:46. Waiting another 5 minutes
New run in 5 minutes: 20-10-19-05-27