У меня есть сценарий очереди, который каждую секунду находит новые задания из базы данных и обрабатывает их. Иногда он ничего не делает в течение 10 часов, а иногда он получает 1000 новых заданий за 3 минуты. Очередь в основном работает нормально.
Однако его нужно перезапустить. (Я не совсем уверен, почему. Я думаю, что другим службам, с которыми работают задания, не нравятся открытые соединения в течение длительного времени. Перезапуск очереди сбрасывает все соединения. Может быть, не поэтому.) И иногда сценарий очереди просто умирает . Может ошибка памяти, точно не могу определить.
Есть 2 способа перезапуска, которые меня устраивают (но он должен быть автоматическим):
ctrl C
+ ./queue.sh
Я тоже не уверен ... Очередь идет в screen
поэтому я могу следить за результатами, когда захочу. Как одна команда может ожидать завершения другой команды и перезапускать ее, не являясь демоном?
Ничего не могу установить. Это дрянной сервер Redhat, к которому у меня нет приличного доступа администратора.
Я думал о создании cronjob, который запускается каждые 24 часа и убивает себя через 24 часа, но это звучит так неправильно ... Я не могу использовать cronjob для очереди, потому что новые задания должны выполняться почти мгновенно.
Вы можете запустить ./queue.sh
в качестве потомка сценария монитора, например:
1. #!/bin/bash
2. while true; do
3. ./queue.sh & q_pid="${!}"
4. ( sleep 86400 ; kill "${q_pid}" ) & s_pid="${!}"
5. wait "${q_pid}"
6. kill "${s_pid}"
7. wait "${s_pid}"
8. done
Как это устроено:
Скрипт монитора запускает ./queue.sh
процесс в фоновом режиме (строка 3) и подпроцесс, который спит в течение одного дня и убивает ./queue.sh
(строка 4). Затем он ждет ./queue.sh
закончить (строка 5).
Если ./queue.sh
заканчивается преждевременно, монитор убивает sleep
process (строка 6), поэтому он не убьет невинный процесс с тем же PID в будущем. В wait
команда в строке 7 предотвращает sleep
процесс от зомби.
Если ./queue.sh
казнь длится более 24 часов, принудительно завершается, когда sleep
процесс завершается (строка 4).
queue.sh
должен быть запущен какой-то процесс. Вы можете изменить его так, чтобы он зацикливался - что-то вроде этого (ниже не обязательно действительный bash, просто какой-то псевдокод):
do
processqueue
loop
Затем напишите cronjob, который убивает processqueue
процесс в 01:00 или в любое другое время. Процесс умрет, и цикл перезапустит его.