Я установил список cron, некоторые из скриптов cron запускаются долго (например, 1-5 часов, и они увеличиваются с каждым днем). Я не хочу запускать два сценария cron одновременно, поскольку у меня нет ресурсов или необходимости для этого. Мне нужно найти решение, чтобы запланированные сценарии не запускались, пока не завершится другой предыдущий сценарий. У меня в списке 10-15 задач cron, 5 из которых я не хочу перекрывать.
Есть ли у кого-нибудь предложения по поводу того, какое решение я должен искать более внимательно, чтобы достичь своей цели?
A. Создайте временный файл блокировки, который будет использоваться скриптом во время его работы, если новый скрипт найдет этот файл - он остановится.
т.е.
if [ -a lockfile ]; then
exit 0
else
touch lockfile
fi
... rest of code...
rm -f lockfile
B. С помощью этого сценария проверьте, не запущен ли уже другой сценарий, например ps auxwf | grep blabla.
Использование файла блокировки может привести к ситуации, когда ежедневное задание cron не запускается. Вы думали о том, чтобы запускать эти задания из одного задания cron последовательно?
#!/bin/bash/ sh /jobs/somejob1 sh /jobs/somejob2
Я рекомендую запускать тяжелые приложения ввода-вывода последовательно с одного задания
Вы также можете работать с файлами блокировки в PHP. Точно такую же проблему я решил с кодом:
$lockfile='/tmp/'.__CLASS__.'.lock'; // the lockfile should be different for each script
$lock=fopen($lockfile, 'w');
if(!flock($lock, LOCK_EX|LOCK_NB)){
// $this->log("This process is already started, i'm exiting.");
exit;
}
Поместите это в начало вашего сценария работы.
Есть пакет lockfile-progs, доступный в любом дистрибутиве, производном от debian (и, возможно, в другом), и он работает.
Та же самая тема поднималась на Sysadvent ранее в этом месяце: http://sysadvent.blogspot.co.uk/2012/12/day-4-zookeeper-for-distributed.html
Вы можете использовать Zookeeper в качестве распределенного диспетчера блокировок для файлов блокировки в кластере машин.