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

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

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

Сообщение Yiivgeny » 2012.01.04, 04:46

PHPDocCrontab
Расширение для Yii Framework добавляющее возможность удобно управлять автоматическим запуском консольных команд используя синтаксис phpDocumentor и crontab.

Возможности и преимущества
  • Полностью идентичный синтаксис для Unix и Windows платформ (сходный со стандартным синтаксисом crontab)
  • Установка времени запуска каждого экшена команды в отдельности, используя всего одно задание в системном планировщике
  • Установка дополнительных параметров запуска (аргументы, stderr, stdout)
  • Возможность отмечать каждый экшен тегами, т.е. группировать экшены в наборы команд (например для запуска разных наборов на разных серверах)
  • Быстрое отключение\включение всех запланированных заданий
  • Хранение расписания заданий вместе с исходными кодами приложения

Как это использовать?
Во-первых, необходимо снабдить каждый экшен, который вы желаете запускать автоматически phpDoc-комментарием похожим на этот

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

class TestCommand extends CConsoleCommand{    
    
/**
     * Это действие будет запускаться каждый третий час на двенадцатой минуте
     * 
     * @cron 12  *\3  *  *  *
     */
    public function actionTest(){;}    
}

Во-вторых, вы должны скачать расширение отсюда https://github.com/Yiivgeny/Yii-PHPDocCrontab/downloads, распаковать его в папку расширений

Далее необходимо внести изменения в конфигурацию вашего приложения, добавив директиву

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

..., 
 
'commandMap' => array(
    'cron' => 'ext.PHPDocCrontab.PHPDocCrontab'
),
... 


И последним шагом, вам необходимо установить в планировщик заданий запуск этого скрипта каждую минуту, чтобы расширение могло запускать ваши команды. Например добавить вот такое задание в cron:

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

* * * * * /path/to/your/application/protected/yiic cron

Теперь вам достаточно добавлять\редактировать\убирать комменитарии из исходного кода, чтобы управлять соответствующими заданиями.

Требования
Необходим Yii Framework версии 1.1.6 или старше.

К пользователям
Прошу отписываться тех, кто использует много консольных команд запускаемых из планировщика или тех кто считает расширение привлекательным.

В планах добавить следующее, если кого-то заинтересует:
  • Полную документацию по уже реализованным возможностям
  • Улучшить работу с перенаправлением вывода (подстановки, использование алиасов Yii)
  • Использовать кеш для получения списка заданий

С нетерпением жду комментариев. Заранее спасибо
Последний раз редактировалось Yiivgeny 2012.05.30, 01:57, всего редактировалось 4 раза.

PixoiD
Сообщения: 111
Зарегистрирован: 2009.09.25, 10:14

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

Сообщение PixoiD » 2012.01.04, 10:45

Что то не работает
добавил:

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

/**
     * @cron * * * * *
     */
    
public function actionTest(){ 


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

'commandMap' => array(
        
'mapper' => 'ext.W3CronCommand.W3CronCommand'
    
),

    
'components'=>array(... 
Сила аргументов, аргументы силы!

Yiivgeny
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.01.04, 12:02

А в системный плнанировщик добавили? В вашем случае (application/protected/yiic mapper)
Yii какой версии? ОС?

PixoiD
Сообщения: 111
Зарегистрирован: 2009.09.25, 10:14

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

Сообщение PixoiD » 2012.01.04, 12:20

все добавил Yii 1.1.9 система debian 6
Сила аргументов, аргументы силы!

Yiivgeny
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.01.04, 12:37

На всякий случай посмотрите наличие задания с помощью команды
./yiic mapper view

И попробуйте создать папку logs в runtime, а в исходниках я поправлю вскоре, если дело только в этом

PixoiD
Сообщения: 111
Зарегистрирован: 2009.09.25, 10:14

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

Сообщение PixoiD » 2012.01.04, 12:55

./yiic mapper view

отдает:

Action tests.test on * * * *
(default)
Сила аргументов, аргументы силы!

Yiivgeny
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.01.04, 12:59

Создание папки (и возможности записи в нее) решило проблему?
Если не хотите создавать директорию, можете воспользоваться тегом
@cron-stdout /dev/null

PixoiD
Сообщения: 111
Зарегистрирован: 2009.09.25, 10:14

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

Сообщение PixoiD » 2012.01.04, 13:07

Yiivgeny писал(а):Создание папки (и возможности записи в нее) решило проблему?
Если не хотите создавать директорию, можете воспользоваться тегом
@cron-stdout /dev/null


нет сам крон отрабатывает а вот мой тест нет...((( печалька , даже не могу понять по чему

подебажил и вот после это цикала выходит

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

foreach ($now AS $key => $piece){
                    
//Проверяем наличие текущей части даты в дате исполнения задания
                    
if (!in_array($piece$task['docs'][0][$key])) continue 2;
                } 
Сила аргументов, аргументы силы!

Yiivgeny
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.01.04, 13:13

У вас точно верно задание вписано? Потому что на view не хватает куска даты (только 4 звездочки вместо 5)

PixoiD
Сообщения: 111
Зарегистрирован: 2009.09.25, 10:14

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

Сообщение PixoiD » 2012.01.04, 13:16

Yiivgeny писал(а):У вас точно верно задание вписано? Потому что на view не хватает куска даты (только 4 звездочки вместо 5)


я извиняюсь просто в консоли не влезло а так там 5*
Сила аргументов, аргументы силы!

Yiivgeny
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.01.04, 13:23

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

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

var_dump($task['docs'][0], $now); 

PixoiD
Сообщения: 111
Зарегистрирован: 2009.09.25, 10:14

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

Сообщение PixoiD » 2012.01.04, 13:31

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

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
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.01.04, 16:00

Обновил архив и первый пост.
  • Добавлена директива для установки папки в которую будут складываться логи.
  • Папка для логов по умолчанию изменена с runtime/logs/ на /runtime/
  • Исправлена ошибка с пробелами в phpDoc-тегах

Yiivgeny
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.01.04, 16:01

PixoiD писал(а):Нашел где косяк
Благодарю за помощь.

Аватара пользователя
nizsheanez
Сообщения: 802
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

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

Сообщение nizsheanez » 2012.01.05, 19:19

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

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

Yiivgeny
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.01.05, 19:44

1) Логи чего именно?
2) Мм, каждая команда запускается отдельным процессом и дальше за ней нет никакого слежения, соответственно отсылка на почту и отлов исключений это мне кажется задача именно самих команд. Или я что-то не понял?

Yiivgeny
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.01.11, 16:20

Несколько изменений в настройках.
Так же добавлено логирование через 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
Сообщения: 312
Зарегистрирован: 2011.06.06, 01:39

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

Сообщение Insolita » 2012.05.18, 01:09

Очень интересная идея, к сожалению скачать расширение по ссылке не получается -( Где его найти можно?

Yiivgeny
Сообщения: 70
Зарегистрирован: 2010.11.24, 10:39

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

Сообщение Yiivgeny » 2012.05.18, 01:29

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



Вернуться в «Авторский код и библиотеки»

Кто сейчас на конференции

Сейчас этот форум просматривают: Yahoo [Bot] и 1 гость