Для получения полного доступа
зарегистрируйтесь.
RSS

Все сниппеты с тэгом «cron»



Roman Zhuravlev
  • Репутация: 6
  • Сниппеты: 3
  • Ревизии: 0

Пусковой скрипт для запуска cron-команд в docker-контенере. Проверяет cron-выражение и запускает команду. Умеет выход по сигналам SIGTERM и SIGINT. В отличии от стандартного cron-демона следующую команду не запустит пока не выполнит предыдущую. Удобно использовать при разработке c docker-compose. В логах докера показывает что запускалось, когда, и с каким результатом.

#!/usr/bin/env php
<?php
/**
 * Скрипт для запуска команды по расписанию, для замены cron-а в сети из docker-контейнеров.
 *
 * Пример команды, которая будет запускаться каждую минуту:
 * docker/php/cron.php "* * * * *" php yii rate/update
 *
 * Зависимости:
 * "mtdowling/cron-expression": "~1.2.0"
 *
 * @author Roman Zhuravlev <zhuravljov@gmail.com>
 */

require(__DIR__ . '/../../vendor/autoload.php');

// Params
$params = $_SERVER['argv'];
array_shift($params);
$expression = array_shift($params);
$command = implode(' ', $params);
$schedule = \Cron\CronExpression::factory($expression);

// Signal handler
$signal = 0;
$signalHandler = function ($sigNum) use (&$signal) {
    $signal = $sigNum;
};
pcntl_signal(SIGTERM, $signalHandler);
pcntl_signal(SIGINT, $signalHandler);

// Loop
printLog('Cron started');
while (true) {
    sleep(60 - time() % 60);
    pcntl_signal_dispatch();
    if ($signal) {
        printLog("Cron stopped by signal $signal");
        exit(0);
    }
    if (!$schedule->isDue()) {
        continue;
    }
    $startedAt = microtime(true);
    printLog("[started] command: $command", $startedAt);
    passthru($command, $exitCode);
    $finishedAt = microtime(true);
    $totalTime = sprintf('%01.3f', $finishedAt - $startedAt);
    printLog("[finished] duration $totalTime s, exit code $exitCode");
    if ($exitCode) {
        exit($exitCode);
    }
}

function printLog($message, $time = null)
{
    echo date('Y-m-d H:i:s', $time ?? time()), ' ' , $message, PHP_EOL;
}
Сниппет,  Bash

CRON task

Gravatar image
Иван Орлов
  • Репутация: 4
  • Сниппеты: 1
  • Ревизии: 0
# m h dom mon dow   command
/usr/bin/php -q /var/www/site/yii sitemap >/dev/null 2>&1

dow: sun mon tue wed thu fri sat
mon: jan feb mar apr may jun jul aug sep oct nov dec 

@reboot 	Запуск при загрузке 	
@yearly 	Раз в год 	0 0 1 1 *
@annually 	Тоже что и @yearly 	
@monthly 	Раз в месяц 	0 0 1 * *
@weekly 	Раз в неделю 	0 0 * * 0
@daily 	 	Раз в день 	0 0 * * *
@midnight 	В полночь (00:00) 	
@hourly 	Каждый час 	0 * * * *
corpsee
  • Репутация: 13
  • Сниппеты: 5
  • Ревизии: 0
<?php
/**
 * Функция ограничения кол-ва одновременно запущенных процессов скрипта с помощью файловых локов.
 * Полезна для скриптов, которые запускаются по крону с некоторой периодичностью.
 *
 * @param string  $process_name Название скрипта
 * @param integer $processes    Разрешенное кол-во одновременно запущенных процессов скрипта
 */
function lockProcess($process_name, $processes = 1) {
    $lock_file   = __DIR__ . $process_name . '_0.lock';
    $lock_exists = file_exists($lock_file);
    $i = 0;
    while ($i < $processes) {
        $lock_file   = __DIR__ . $process_name . '_' . $i . '.lock';
        $lock_exists = file_exists($lock_file);
        if (!$lock_exists) {
            break;
        }
        $i++;
    }
    // Если блокировку получить не удалось, значит второй экземпляр скрипта работает
    $lock_file_handler = fopen($lock_file, 'w');
    if (!flock($lock_file_handler, LOCK_EX | LOCK_NB)) {
        exit();
    }
    
    // Если файл блокировки уже существовал, но не был залочен, значит предыдущий запуск скрипта завершился некорректно
    if ($lock_exists) {
        error_log('Предыдущий запуск завершился с ошибкой!');
    }
    
    // По окончании работы необходимо снять блокировку и удалить файл
    register_shutdown_function(function() use ($lock_file_handler, $lock_file) {
        flock($lock_file_handler, LOCK_UN);
        unlink($lock_file);
    });
}