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

Автоматически перезапускать процесс командной строки на экране каждый день

У меня есть сценарий очереди, который каждую секунду находит новые задания из базы данных и обрабатывает их. Иногда он ничего не делает в течение 10 часов, а иногда он получает 1000 новых заданий за 3 минуты. Очередь в основном работает нормально.

Однако его нужно перезапустить. (Я не совсем уверен, почему. Я думаю, что другим службам, с которыми работают задания, не нравятся открытые соединения в течение длительного времени. Перезапуск очереди сбрасывает все соединения. Может быть, не поэтому.) И иногда сценарий очереди просто умирает . Может ошибка памяти, точно не могу определить.

Есть 2 способа перезапуска, которые меня устраивают (но он должен быть автоматическим):

  1. Явно перезапускайте его каждые 24 часа: ctrl C + ./queue.sh
  2. Подождите, пока он умрет, и запустите его снова

Я тоже не уверен ... Очередь идет в 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

Как это устроено:

  1. Скрипт монитора запускает ./queue.sh процесс в фоновом режиме (строка 3) и подпроцесс, который спит в течение одного дня и убивает ./queue.sh (строка 4). Затем он ждет ./queue.sh закончить (строка 5).

  2. Если ./queue.sh заканчивается преждевременно, монитор убивает sleep process (строка 6), поэтому он не убьет невинный процесс с тем же PID в будущем. В wait команда в строке 7 предотвращает sleep процесс от зомби.

  3. Если ./queue.sh казнь длится более 24 часов, принудительно завершается, когда sleep процесс завершается (строка 4).

queue.sh должен быть запущен какой-то процесс. Вы можете изменить его так, чтобы он зацикливался - что-то вроде этого (ниже не обязательно действительный bash, просто какой-то псевдокод):

  do
      processqueue
  loop

Затем напишите cronjob, который убивает processqueue процесс в 01:00 или в любое другое время. Процесс умрет, и цикл перезапустит его.