Я запускаю работу каждую минуту, чтобы переиндексировать содержимое моего сайта.
Сегодня поисковая система умерла, и когда я вошел в систему, были сотни потерянных процессов, которые были запущены cron.
Есть ли другой способ использования какого-либо существующего программного обеспечения, которое позволит мне выполнять задание каждую минуту, но не запускает другой экземпляр, если это задание не возвращается (т. Е. Из-за сбоя процесса поисковой системы)?
cron
scheduled-task
Джон
источник
источник
Ответы:
Проблема не в cron, а в вашей работе.
Вам нужно, чтобы ваша работа взаимодействовала с замком некоторого описания. Самый простой способ сделать это - попытаться создать каталог и в случае успеха продолжить, если не выйти. Когда ваша работа завершится и завершится, она должна удалить каталог, готовый к следующему запуску. Вот сценарий для иллюстрации.
Запустите его на одном терминале, затем, до истечения 60 секунд, запустите его на другом терминале, и он выйдет со статусом 1. После выхода из первого процесса вы можете запустить его со второго терминала ...
РЕДАКТИРОВАТЬ:
Как только я узнал о стаде, я решил обновить этот ответ. flock (1) может быть проще в использовании. В этом случае
flock -n
представляется целесообразным, например,Будет запускать вашу работу каждую минуту, но потерпит неудачу, если flock не сможет получить блокировку файла.
источник
Один из способов - заставить ваш скрипт переиндексации создать файл блокировки, чтобы он мог проверить, есть ли уже запущенный экземпляр скрипта. Вы также можете добавить некоторую обработку исключений, чтобы увидеть, работает ли поисковая система.
Более сложной альтернативой было бы использование какой-либо очереди задач, такой как Resque и Resque-scheduler:
https://github.com/blog/542-introducing-resque
https://github.com/bvandenbos/resque-scheduler#readme
Также есть Ку и Сидекик:
https://github.com/bkeepers/qu
https://github.com/mperham/sidekiq
Да, все это ориентировано на Ruby, но вы можете искать «такие вещи, как resque» на языке по вашему выбору.
источник
Другой способ быстро настроить это - запустить сценарий оболочки при запуске машины (cron может сделать это с помощью '
@reboot /path/to/my/script.sh
', затем перезапустить cron, чтобы запустить его) с чем-то вроде этого.Сценарий продолжает работать, и если вы только что запустили один - это то, сколько может быть запущено одновременно - не более того. Некоторые смарты также могут проверить, работает ли индексатор, и, если нет, перезапустить или иным образом попытаться исправить / уведомить кого-то о проблеме.
источник
Вместо того, чтобы использовать для этого cron, я бы больше строил вашу работу как службу, которая работает в цикле и спит 60 секунд в качестве последнего шага, или, возможно, спит чаще для меньших интервалов в различных точках во время процесса, чтобы помочь распределить нагрузку более равномерно
источник