Как более грамотно планировать работу сервера, чем cron?

15

Я запускаю работу каждую минуту, чтобы переиндексировать содержимое моего сайта.

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

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

Джон
источник
4
Cron, скорее всего, делает именно то, что вы говорите. Вместо этого я предлагаю разумно переписать работу.
gparent

Ответы:

27

Проблема не в 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 не сможет получить блокировку файла.

user9517
источник
2
Может быть, это глупый вопрос, но есть ли какие-то преимущества в использовании каталога, а не обычного файла?
gparent
9
Использование обычного файла требует нескольких операций, проверьте, если он существует, если он не создает его. Это оставляет окно возможности для другого процесса для создания файла - грязный. Mkdir - это атомарная операция, она либо работает, и вы получаете «блокировку», либо ее нет, поскольку другой процесс уже имеет ее.
user9517
Имеет смысл. Хорошо подумать и о каталоге блокировки. Спасибо
Джон
2

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

Более сложной альтернативой было бы использование какой-либо очереди задач, такой как 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» на языке по вашему выбору.

CJC
источник
0

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

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

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

Алистер Булман
источник
-3

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

Джоэл Коэль
источник
1
Это не решит проблему и не улучшит cron.
gparent
Это решило бы проблему, потому что тогда есть только один процесс, который выполняется когда-либо. Это обошло бы Крона полностью.
Джоэл Коэль
Это не решает проблему, если «сервис» не смотрит, работает ли поисковая система. Его логика сценария / работы - проблема. РЕДАКТИРОВАТЬ: На самом деле, вы несколько правы, это бы уродливо скрыл проблему.
gparent