Crontab, bash и drush

Пт, 26/05/2017 - 20:40

Всем привет! Появилась такая задача: имеется bash скрипт, который выполняет php скрипт с функцией из модуля. Необходимо выполнять этот скрипт с помощью crontab каждую минуту.
Пример bash скрипта, который лежит в домашней папке сайта.

#!/bin/bash
drush --uri=niirt.nntc.nnov.ru scr sites/all/modules/rules_cron_maker/drush_runner.php

Пример php скрипта

<?php
error_reporting
(E_ERROR E_PARSE);

rules_cron_maker_iter();

?>

И само собой модуль с функцией
rules_cron_maker.module

<?php
function rules_cron_maker_iter(){
    
$query = new EntityFieldQuery();
    
$query->entityCondition('entity_type''node')
        ->
entityCondition('bundle''graph_pills')
        ->
propertyCondition('status'NODE_PUBLISHED);

    $result $query->execute();

    if (isset($result['node'])) {
        
$news_items_nids array_keys($result['node']);
        
$news_items entity_load('node'$news_items_nids);
    }

    foreach ($news_items as $item){

        var_dump(array("curtime"=>REQUEST_TIME"stamp" => $item->field_timestamp['und'][0]['value'], "title"=>$item->title));
    if(
$item->field_timestamp['und'][0]['value']==REQUEST_TIME){
        echo 
'отправлено';
        
mail('aggrezzorhsdj@gmail.com''My Subject''qweqweqweqweqwe');
        
    } else {

        echo 'не отправлено';
    }
        
    }

}?>

0 Спасибо

Комментарии

Аватар пользователя bsyomov
1 month 2 дня назад bsyomov #

Так а в чём проблема-то?
Осталось только добавить в кронтаб строку:
*/1 * * * * /path/to/drush --uri=niirt.nntc.nnov.ru scr sites/all/modules/rules_cron_maker/drush_runner.php

Где /path/to/drush, соответственно, зависит от того, куда он установлен.

0 Спасибо
Аватар пользователя aggrezzorhsdj
1 month 2 дня назад aggrezzorhsdj #

Вот, точно, я так это и подозревал, конкретно затупил, спасибо большое!

0 Спасибо
Аватар пользователя aggrezzorhsdj
1 month 2 дня назад aggrezzorhsdj #

Или не все так просто. Drush лежит в /usr/bin/drush, пути прописал в кронтабе, вроде бы все замечательно. Попытался вызвать сам drush
/usr/bin$ drush --uri=niirt.nntc.nnov.ru scr sites/all/modules/rules_cron_maker/drush_runner.php
Кричит, что Unable to find any of the following. Логично, поэтому прописал полный путь к пых скрипту
/usr/bin$ drush --uri=niirt.nntc.nnov.ru scr ~/www/sites/all/modules/rules_cron_maker/drush_runner.php
На что он тоже вывалил ошибки

PHP Fatal error:  Uncaught Error: Call to undefined function rules_cron_maker_iter() in /home/niirt/www/sites/all/modules/rules_cron_maker/drush_runner.php:4
Stack trace:
#0 /usr/share/php/drush/commands/core/core.drush.inc(1031): include()
#1 /usr/share/php/drush/includes/command.inc(334): drush_core_php_script('/home/niirt/www...')
#2 /usr/share/php/drush/includes/command.inc(208): _drush_invoke_hooks('php-script', Array, 'core')
#3 /usr/share/php/drush/includes/command.inc(175): drush_command('/home/niirt/www...')
#4 /usr/share/php/drush/drush.php(92): drush_dispatch(Array)
#5 /usr/share/php/drush/drush.php(61): _drush_bootstrap_and_dispatch()
#6 /usr/share/php/drush/drush.php(16): drush_main()
#7 {main}
  thrown in /home/niirt/www/sites/all/modules/rules_cron_maker/drush_runner.php on line 4
Drush command terminated abnormally due to an unrecoverable error.                                                                         [error]
Error: Uncaught Error: Call to undefined function rules_cron_maker_iter() in
/home/niirt/www/sites/all/modules/rules_cron_maker/drush_runner.php:4
Stack trace:
#0 /usr/share/php/drush/commands/core/core.drush.inc(1031): include()
#1 /usr/share/php/drush/includes/command.inc(334): drush_core_php_script('/home/niirt/www...')
#2 /usr/share/php/drush/includes/command.inc(208): _drush_invoke_hooks('php-script', Array, 'core')
#3 /usr/share/php/drush/includes/command.inc(175): drush_command('/home/niirt/www...')
#4 /usr/share/php/drush/drush.php(92): drush_dispatch(Array)
#5 /usr/share/php/drush/drush.php(61): _drush_bootstrap_and_dispatch()
#6 /usr/share/php/drush/drush.php(16): drush_main()
#7 {main}
  thrown in /home/niirt/www/sites/all/modules/rules_cron_maker/drush_runner.php, line 4

Но есть еще один факт, если выполнять drush --uri и так далее в папке с drupal'ом, то все работает

0 Спасибо
Аватар пользователя multpix
1 month 2 дня назад multpix #

--root=ABSOLUTE_PATH_TO_DRUPAL_ROOT

0 Спасибо
Аватар пользователя bsyomov
1 month 2 дня назад bsyomov #

Точно, не заметил, что указан только --uri, без --root.

Ещё можно прописать alias для сайтов в drushrc

<?php
$aliases
['mysite'] = array(
   
'root' => '/path/to/drupal/root',
   
'uri' => 'http://domain.tld',
);
?>

И вызывать как

drush @mysite command
0 Спасибо
Аватар пользователя aggrezzorhsdj
1 month 20 часов назад aggrezzorhsdj #

извиняюсь опять же за глупые вопросы, можете подсказать, --root=ABSOLUTE_PATH_TO_DRUPAL_ROOT куда в строке на кронтаб пихать? и вместо absolute path писать путь к папке с друпалом?

0 Спасибо
Аватар пользователя multpix
1 month 8 часов назад multpix #

просто ключ для вызова drush не из корня дру

0 Спасибо
Аватар пользователя bsyomov
1 month 6 часов назад bsyomov #

После drush пихать. Да, путь до папки с drupal.

0 Спасибо
Аватар пользователя aggrezzorhsdj
1 month 9 часов назад aggrezzorhsdj #

хотя, я сделал проще. Сделал bash скрипт

#!/bin/bash
cd ~/www/
и команда drush

Просто перешел как говорится в корневую папку друпала)

0 Спасибо
Аватар пользователя bsyomov
1 month 3 часа назад bsyomov #

Можно было без скрипта, с помощью оператора &&:

cd /path/to/drupal && /path/to/drush command

Кстати, не полагайтесь на переменную окружения PATH, и не ленитесь в скриптах писать пути. а не только команды. Она в контексте выполнения скрипта, например в cron, может и не быть установлена.

0 Спасибо