Управление автоматическим запуском консольных команд

Выкладываем свои наработки
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Управление автоматическим запуском консольных команд

Сообщение Yiivgeny »

Было бы замечательно в таком случае посмотреть

Код: Выделить всё

var_dump($task['docs'][0], $now); 
PixoiD
Сообщения: 111
Зарегистрирован: 2009.09.25, 10:14

Re: Управление автоматическим запуском консольных команд

Сообщение PixoiD »

Код: Выделить всё

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
            [3] => 3
            [4] => 4
            [5] => 5
            [6] => 6
            [7] => 7
            [8] => 8
            [9] => 9
            [10] => 10
            [11] => 11
            [12] => 12
            [13] => 13
            [14] => 14
            [15] => 15
            [16] => 16
            [17] => 17
            [18] => 18
            [19] => 19
            [20] => 20
            [21] => 21
            [22] => 22
            [23] => 23
            [24] => 24
            [25] => 25
            [26] => 26
            [27] => 27
            [28] => 28
            [29] => 29
            [30] => 30
            [31] => 31
            [32] => 32
            [33] => 33
            [34] => 34
            [35] => 35
            [36] => 36
            [37] => 37
            [38] => 38
            [39] => 39
            [40] => 40
            [41] => 41
            [42] => 42
            [43] => 43
            [44] => 44
            [45] => 45
            [46] => 46
            [47] => 47
            [48] => 48
            [49] => 49
            [50] => 50
            [51] => 51
            [52] => 52
            [53] => 53
            [54] => 54
            [55] => 55
            [56] => 56
            [57] => 57
            [58] => 58
            [59] => 59
        )

    [1] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
            [3] => 3
            [4] => 4
            [5] => 5
            [6] => 6
            [7] => 7
            [8] => 8
            [9] => 9
            [10] => 10
            [11] => 11
            [12] => 12
            [13] => 13
            [14] => 14
            [15] => 15
            [16] => 16
            [17] => 17
            [18] => 18
            [19] => 19
            [20] => 20
            [21] => 21
            [22] => 22
            [23] => 23
        )

    [2] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
            [6] => 7
            [7] => 8
            [8] => 9
            [9] => 10
            [10] => 11
            [11] => 12
            [12] => 13
            [13] => 14
            [14] => 15
            [15] => 16
            [16] => 17
            [17] => 18
            [18] => 19
            [19] => 20
            [20] => 21
            [21] => 22
            [22] => 23
            [23] => 24
            [24] => 25
            [25] => 26
            [26] => 27
            [27] => 28
            [28] => 29
            [29] => 30
            [30] => 31
        )

    [3] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
            [6] => 7
            [7] => 8
            [8] => 9
            [9] => 10
            [10] => 11
            [11] => 12
        )

    [4] => Array
        (
            [0] => *
        )

)
Array
(
    [0] => 31
    [1] => 14
    [2] => 4
    [3] => 1
    [4] => 3
) 
Нашел где косяк

Код: Выделить всё

$dimensions = array(
            array(0,59), //Minutes
            array(0,23), //Hours
            array(1,31), //Days
            array(1,12), //Months
            array(0,6),  //Weekdays
        );
        foreach ($parameters AS $n => &$repeat) {
//Добавить trim
            $repeat = trim($repeat);
 
Сила аргументов, аргументы силы!
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Управление автоматическим запуском консольных команд

Сообщение Yiivgeny »

Обновил архив и первый пост.
  • Добавлена директива для установки папки в которую будут складываться логи.
  • Папка для логов по умолчанию изменена с runtime/logs/ на /runtime/
  • Исправлена ошибка с пробелами в phpDoc-тегах
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Управление автоматическим запуском консольных команд

Сообщение Yiivgeny »

PixoiD писал(а):Нашел где косяк
Благодарю за помощь.
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Re: Управление автоматическим запуском консольных команд

Сообщение nizsheanez »

Вещь конечно классная.
Надо развивать!

Пожелания:
1. Что бы логи писал хорошие
2. Добавить поддержку событий, скажем если команда выкинула исключение, то выполнить такой-то набор команд. Тогда можно будет на эти события повесить отправку стека на почту и т.п.
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Управление автоматическим запуском консольных команд

Сообщение Yiivgeny »

1) Логи чего именно?
2) Мм, каждая команда запускается отдельным процессом и дальше за ней нет никакого слежения, соответственно отсылка на почту и отлов исключений это мне кажется задача именно самих команд. Или я что-то не понял?
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Управление автоматическим запуском консольных команд

Сообщение Yiivgeny »

Несколько изменений в настройках.
Так же добавлено логирование через Yii::log
Добавлены нормальные примеры синтаксиса.

Код: Выделить всё

class ExampleCommand extends CConsoleCommand{

    /**
     * Простой пример.
     * Запуск каждый час на 10-ой минуте.
     *
     * @cron 10 * * * *
     */
    public function actionexample1(){}

    /**
     * Пример тегирования.
     * Действие будет запущено только если расширение запускается командой содержащий тег "dbserver" или "cacheserver".
     * Например так: `./yiic cron run   dbserver storageserver`
     *
     * @cron 10 * * * *
     * @cron-tags dbserver cacheserver
     */
    public function actionexample2(){}

    /**
     * Пример перенаправления STDOUT и STDERR в один и тот же файл.
     *
     * @cron 10 * * * *
     * @cron-stdout /tmp/ExampleCommand.log
     */
    public function actionexample3(){}

    /**
     * Пример перенаправления STDOUT и STDERR в разные файлы.
     *
     * @cron 10 * * * *
     * @cron-stdout /tmp/ExampleCommand.log
     * @cron-stderr /tmp/ExampleCommandError.log
     */
    public function actionexample4(){}

    /**
     * Пример перенаправления STDERR в файл (STDOUT выводится в файл по умолчанию).
     *
     * @cron 10 * * * *
     * @cron-stderr /dev/null
     */
    public function actionexample5(){}

    /**
     * Пример команды с аргументами.
     * Аргументы вводятся точно так же как и при обычном запуске через консоль, с сохранением всех возможностей.
     *
     * @cron 10 * * * *
     * @cron-args --limit=5 --offset=10
     */
    public function actionexample6($limit, $offset){}

    /**
     * Пример расширенного использования времени запуска.
     * Действие будет запускаться
     * каждую 10, 25, 26, 27, 28, 29, 30, 40 минуту
     * каждого 2-го (четного) часа
     * с 15 по 21, и с 23 по 27 число
     * каждого 2-го (четного) месяца в период с января по июнь включительно
     * независимо от дня недели.
     *
     * @cron 10,25-30,40 *\2 15-21,23-27 1-6\2 *
     */
    public function actionexample7(){}

    /**
     * Все описанные конструкции могут использоваться совместно и в любом порядке.
     *
     * @cron 10,25-30,40 *\2 15-21,23-27 1-6\2 *
     * @cron-stderr /dev/null
     * @cron-args --limit=5 --offset=10
     * @cron-tags dbserver cacheserver
     * @cron-stdout /tmp/ExampleCommand.log
     */
    public function actionexample8($limit, $offset){}
} 
И описание конфигурации

Код: Выделить всё

/**
 * Конфигурация с заменой параметров.
 * Примечание: каждая из перечисленных ниже опций может быть динамически определена во время запуска.
 * Пример: `./yiic cron run --optionName=optionValue`
 */
return array (
    'commandMap' => array(
        'cron' => array(
            'class' => 'ext.PHPDocCrontab.PHPDocCrontab',
            /**
             * Префикс тегов при парсинге (по умолчанию cron)
             * Изменяя вы можете иные теги-задания, например
             * @mycron * * * *
             * @mycron-stderr /dev/null
             */
            'tagPrefix' => 'mycron',
            /**
             * Принудительная установка исполняемого файла интерпретатора
             */
            'interpreterPath' => '/usr/local/bin/php -d foo=bar',
            /**
             * Установка папки по умолчанию для сохранения логов.
             * Используется если задание указано без @cron-stdout
             * По умолчанию application.runtime
             */
            'logsDir' => '/var/log/yiiapp/',
            /**
             * Принудительная установка bootstrap-скрипта.
             * По умолчанию используется скрипт с помощью которого запущено само расширение.
             */
            'bootstrapScript' => __DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'yiicMod.php',
            /**
             * Временная метка в формате поддерживаемом функцией strtotime,
             * которая будет использована в качестве текущей при запуске заданий.
             *
             * Можно использовать для запуска всех необходимых скриптов, если время запуска было пропущено.
             * Так же можно использовать как метод коррекции часовых поясов сервера по отношению к приложению.
             */
            'timestamp' => 'now - 1 hour 25 minutes'
        )
    )
); 
Последний раз редактировалось Yiivgeny 2012.05.30, 01:59, всего редактировалось 2 раза.
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Управление автоматическим запуском консольных команд

Сообщение Insolita »

Очень интересная идея, к сожалению скачать расширение по ссылке не получается -( Где его найти можно?
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Управление автоматическим запуском консольных команд

Сообщение Yiivgeny »

Было желание выложить в офф репозиторий, но ввиду малой заинтересованности так и откладывается.
Переименовано и переехало на гитхаб. https://github.com/Yiivgeny/Yii-PHPDocCrontab
aoglib
Сообщения: 2
Зарегистрирован: 2012.08.15, 09:08

Re: Управление автоматическим запуском консольных команд

Сообщение aoglib »

При тестировании в Windows 7 сразу наткнулся на несколько проблем:
1) Задание времени с числами меньше 10. т.е. если укажу @cron 5 1 * * * (каждый день в пять минут второго) не сработает в 01:05 изза проверки in_array($piece, $task['docs'][0][$key]) 5!='05' и 1!='01' [Line: 253]. Похоже об этой же проблеме говорил PixoiD
PixoiD писал(а): подебажил и вот после это цикала выходит
2) Передача аргументов не работает. Причина использование функции escapeshellarg для всех аргументов сразу [Line: 258]. В PHP документации сказано "использована для того, чтобы экранировать отдельные аргументы"
3) На данный момент логфайл хранит последнюю отработанную информацию, а мне бы хотелось иметь возможность выбора или последняя или вся как в application.log

Несмотря на это, хочу сказать автору спасибо. полезная вещь
Последний раз редактировалось aoglib 2013.12.26, 15:32, всего редактировалось 2 раза.
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Управление автоматическим запуском консольных команд

Сообщение Yiivgeny »

Проверю и поправлю в ближайшее время. Спасибо за репорт.
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Управление автоматическим запуском консольных команд

Сообщение Yiivgeny »

aoglib писал(а):При тестировании в Windows 7 сразу наткнулся на несколько проблем:
1) Задание времени с числами меньше 10. т.е. если укажу @cron 5 1 * * * (каждый день в пять минут второго) не сработает в 01:05 изза проверки in_array($piece, $task['docs'][0][$key]) 5!='05' и 1!='01' [Line: 253]. Похоже об этой же проблеме говорил PixoiD
PixoiD писал(а): подебажил и вот после это цикала выходит
Видимо дело, всё-таки не в этом. Во-первых у меня задание отрабатывает, а во-вторых вот работающий код.

Код: Выделить всё

[host]$ php -r "var_dump(in_array(5, array('05')));"
bool(true)
 
Было бы хорошо, если вы помогли мне локализовать проблему.
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Управление автоматическим запуском консольных команд

Сообщение Yiivgeny »

aoglib писал(а): 2) Передача аргументов не работает. Причина использование функции escapeshellarg для всех аргументов сразу [Line: 258]. В PHP документации сказано "использована для того, чтобы экранировать отдельные аргументы"
В репозитории на GitHub есть версия в которой этот баг уже исправлен. К сожалению, я забыл перезалить новую версию в офф. репозиторий.
aoglib
Сообщения: 2
Зарегистрирован: 2012.08.15, 09:08

Re: Управление автоматическим запуском консольных команд

Сообщение aoglib »

После обновления из репозитория GitHub заработали первых два пункта

Спасибо
Ответить