У меня есть Cron Job сценарии, который работает каждые 4 минуты. В редких случаях сценарий не закончен в течение 4 минут. Это вызывает проблемы.
Как я могу выполнить проверку, которые, если там предыдущий сценарий не закончен затем, пропускают текущее выполнение
Ожидаемое поведение:
10:00 : Script A starts
10:04 : Script A2 starts - it finds that script A was not finish so this script aborts. Simply finish without doing nothing.
10:06 : Script A finish
10:08 : Script A3 starts - no other scripts running so it continue
Уведомление: A, A2, A3 являются тем же сценарием (только в различные времена)! Это не должно рассматривать другие сценарии, которые могли бы работать также
Существует два основных подхода:
заставьте сценарий выйти, если он обнаруживает другой экземпляр себя выполнение. Просто добавьте эти строки к началу Вашего сценария:
if [ $(pgrep -c "${0##*/}") -gt 1 ]; then
echo "Another instance of the script is running. Aborting."
exit
fi
$0
название сценария, и ${0##*/}
название сценария со всем до последнего /
удаленный (так, /path/to/script.sh
становится script.sh
). Это означает, что, если у Вас есть другой, несвязанный сценарий с тем же выполнением имени, он будет все еще обнаружен. с другой стороны, это также означает, что это будет работать даже при вызове сценария от символьной ссылки. Какой, который Вы предпочитаете, зависит от Вашего варианта использования.
Используйте файл блокировки и выйдите из сценария, если файл существует:
#!/bin/bash
if [ -e "/tmp/i.am.running" ]; then
echo "Another instance of the script is running. Aborting."
exit
fi
else
touch "/tmp/i.am.running"
fi
## The rest of the script goes here
rm "/tmp/i.am.running"