Назад | Перейти на главную страницу

Как безопасно обновить серверный скрипт, который может быть запущен cron в любой момент

У меня есть серверный скрипт, который запускается 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