@rinaz22

Как запретить запуск скрипта по крону больше 1 раза?

Всем привет. Есть скрипт, который запускается каждую минуту по крону. Иногда скрипт выполняется больше 1 минуты и крон еще раз запускает скрипт(клон). Как можно исключить создание таких клонов? Чтобы не запускать больше скрипт, пока он не завершил текущую работу?
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Barmunk
/usr/bin/flock -w 600 /var/tmp/myscript.lock /root/myscript.sh


Эта комманда запустит /root/myscript.sh и создаст lock-файл для данного процесса. Пока он активен, новый вызов данного скрипта не произойдет.
После завершения программы, блокировка файла снимается и процесс может быть снова запущен.
Параметр -w 600 определяет время ожидания комманды flock на освобождение lock-файла.
Для моментальной отмены выполнения процесса используйте параметр -w 0, для ожидания же бесконечно долгого времени параметр нужно опустить.


https://pingtool.org/ru/using-flock-to-ensure-only...
Ответ написан
Комментировать
SamTop
@SamTop
Лучше не иметь друга, а лучше сразу друг-друга
<?
//Проверка блокировки
if(file_exists("lock.txt"))
  die("copy");

function test228($msg) {
  if (!$f = fopen('test.txt', 'a+')) return false;
  @fputs($f, date('H:i:s > ').$msg."\r\n"));
  @fclose($f);
  return true;
  }

header('Content-Length: 1');
header('Connection: close;');
echo ' ';
@flush();
@ob_flush();

//Блокируем
@file_put_contents("lock.txt", "");

for($i=0; $i<3; $i++) {
    test228("test"); // если использовать эхо будет падать
    sleep(10);
}

//Удаляем блокировку
@unlink("lock.txt");
?>
Ответ написан
@Vitsliputsli
Используйте mutex. Он либо есть в вашем фремворке, либо сделайте сами. Варианты: файловый - реализуется с помощью flock (это такая команда в php, а не внешняя утилита как в другом ответе), в БД - если файловый делать нельзя, например, при нескольких инстансах приложения.
Ответ написан
Комментировать
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Мне больше нравится предложеное выше решение с использованием /usr/bin/flock, но если такой возможности нет -

Можете попробовать https://github.com/kissit/php-cli-lock , хотя там не хватает снятия блокировки в случае неожиданного завершения процесса, но хотя бы есть определения stale-состояния у лока
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы