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

Как планировать серверные задания более разумно, чем с помощью cron?

Каждую минуту я выполняю задание по переиндексации содержания моего сайта.

Сегодня поисковая машина умерла, и когда я вошел в систему, cron запустил сотни бесхозных процессов.

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

Проблема не в cron, а в вашей работе.

Вам нужно, чтобы ваша работа взаимодействовала с замком некоторого описания. Самый простой способ сделать это - попытаться создать каталог и в случае успеха продолжить, если нет - выйти. Когда ваша работа завершится и завершится, она должна удалить каталог, готовый к следующему запуску. Вот сценарий для иллюстрации.

#!/bin/bash

function cleanup {
    echo "Cleanup"
    rmdir /tmp/myjob.lck
}

mkdir /tmp/myjob.lck ||  exit 1
trap cleanup EXIT
echo 'Job Running'
sleep  60
exit 0

Запустите это в одном терминале, затем до истечения 60 секунд запустите его в другом терминале, он выйдет со статусом 1. Как только первый процесс завершится, вы можете запустить его со второго терминала ...

РЕДАКТИРОВАТЬ:

Поскольку я только что узнал о flock, я подумал, что обновлю этот ответ. стадо (1) может быть проще в использовании. В таком случае flock -n казалось бы подходящим, например

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job   

Будет запускать вашу работу каждую минуту, но потерпит неудачу, если flock не сможет заблокировать файл.

Один из способов - создать файл блокировки для вашего скрипта переиндексации, чтобы он мог проверить, есть ли уже запущенный экземпляр скрипта. Вы также можете добавить некоторую обработку исключений, чтобы увидеть, работает ли поисковая система.

Более сложной альтернативой было бы использование какой-то очереди задач, такой как Resque и Resque-scheduler:

https://github.com/blog/542-introduction-resque

https://github.com/bvandenbos/resque-scheduler#readme

Также есть Qu и Sidekiq:

https://github.com/bkeepers/qu

https://github.com/mperham/sidekiq

Да, это все ориентировано на Ruby, но вы можете искать «вещи вроде resque» на любом языке.

Другой способ быстро настроить это - запустить сценарий оболочки при запуске машины (cron может сделать это с помощью '@reboot /path/to/my/script.sh',. затем перезапустите cron, чтобы запустить его) с чем-то вроде этого в нем.

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

Скрипт продолжает работать, и если вы запустили только один - вот сколько может быть запущено одновременно - не более того. Некоторые умные устройства также могут проверить, запущен ли индексатор, а если нет, перезапустить или иным образом попытаться исправить / уведомить кого-то о проблеме.

Вместо того, чтобы использовать для этого cron, я бы построил вашу работу больше как службу, которая работает в цикле и засыпает 60 секунд на последнем шаге, или, возможно, спит чаще в течение меньших интервалов в различные моменты во время процесса, чтобы помочь распределить нагрузку более равномерно.