Понадобилось автоматизировать перезагрузку VPS, на котором хостился сайт на самописной CMS. Особенность сайта заключалась в том, что он падал с ошибкой 500 Internal Server Error во время интенсивного краулинга поисковыми роботами. Поскольку CMS была очень нетипичной, проще было перезагружать сервер, чем вникать в суть проблемы и искать способы исправления.
Для этого был написан bash-скрипт следующего содержания:
#!/bin/bash url='https://site.ru' read -ra result $(curl -Is --connect-timeout 5 "${url}" || echo "timeout 500") status=${result[1]} touch /полный/путь/к/папке/public_html/log.txt if [ $status -ge 400 ]; then date /полный/путь/к/папке/public_html/log.txt sudo reboot fi exit;
Логика его работы:
- Запрашиваем главную страницу сайта site.ru
- Проверяем код состояния HTTP
- Если получен HTTP-статус ≥400, то записываем факт события в лог-файл и перезагружаем сервер
Скрипт нужно сохранить в файл с расширением .sh, а затем сделать исполняемым:
chmod a+x reboot.sh
Проверяем запуск:
./reboot.sh
Если скрипт выдает ошибку, то пересохраняем его в правильной кодировке при помощи утилиты dos2unix:
apt install dos2unix dos2unix reboot.sh
Настраиваем автоматическое выполнение скрипта раз в минуту:
crontab -e
В открывшийся файл вписываем новую строку:
*/1 * * * * /полный/путь/к/reboot.sh
Сохраняем файл. Проверяем, что изменения внесены:
crontab -l
Готово. Теперь при получении кода ответа 500, 502, 504 сервер будет автоматически перезагружаться, а время простоя будет составлять не более одной минуты.