У меня есть серверный скрипт, который запускается cron каждые 10 минут и выполняет некоторые операции с базой данных, поэтому он может работать несколько минут. Как видите, вероятность совпадения процесса обновления и работы скрипта довольно высока, хотя я не могу себе этого позволить, поскольку это может привести к повреждению БД и т. Д.
Моей первой задачей было сделать какой-то запорный механизм, но все, что я представляю, становится довольно сложным: например, Мне кажется, что у меня есть файл PID для запуска скрипта с какой-то блокировкой, но это приводит к такому множеству деталей дьявола, таких как правильная блокировка, избегая ситуаций, когда скрипт завершает работу по ошибке, оставляя файл .pid на диске (предотвращая следующие запуски), и т. д. и т. д.
Тогда мой вопрос: есть ли простой способ сделать это или какая-то библиотека / инструмент, который решает такую проблему?
Спасибо!
Стандартное решение - записать новую версию скрипта в новый файл с временным именем в том же каталоге, что и цель. После того, как сценарий был написан, он переименовывается поверх старой версии. Любой запущенный экземпляр по-прежнему будет использовать старую версию.
Если скрипт называется /usr/local/bin/script.sh
временное имя может быть /usr/local/bin/.script.sh.XXXXXX
где XXXXXX заменяется случайно сгенерированной строкой.
Просто пусть ваш текущий скрипт cron сделает это за вас, когда он будет готов.
echo "cat /tmp/new.cron.sh > /usr/local/bin/current.cron.sh" >> /usr/local/bin/current.cron.sh