Последовательность PHP-скриптов в скрипте Bash, выполненная Cron, не запущена

5

У меня есть четыре скрипта PHP, которые выполняют различные задачи, которые необходимо выполнить последовательно.

Вместо того, чтобы создавать запись cron для каждого PHP script, я думал, что буду умным и обернуть его как Bash script, как показано ниже:

#!/bin/bash

# set notification email.
NOTIFYEMAIL="[email protected]"

# set PHP path.
PHP="$(which php)"

# set folder path.
FOLDER="/var/www/example.com/processors/"

# list of scripts.
SCRIPTS=("script_1" "script_2" "script_3" "script_4")

# execute each script.
for i in "${SCRIPTS[@]}"
do
    SCRIPT="$FOLDER/$i.php"
    printf "Processing: %s\n" $i
    chmod +x $SCRIPT
    $PHP $SCRIPT
done

echo "Scripts have been processed." | mail -s "Scripts Processed" $NOTIFYEMAIL

Я тестировал все сценарии отдельно, и они работают без ошибок, выводя информацию о обработке на терминал.

/usr/bin/php /var/www/example.com/processors/script_1.php

Я даже проверил Bash script, который последовательно вызывает четыре скрипта PHP, вручную через терминал и также работает без ошибок.

/bin/bash /var/www/example.com/processors/run.sh

Но по какой-то причине скрипты PHP не выполняются, когда я оставляю cron для их запуска, используя следующее в root пользователя crontab.

# process daily.
0 1 * * * /bin/bash /var/www/example.com/processors/run.sh > /dev/null

Я знаю, что crontab обработан и Bash script запущен, потому что я всегда получаю уведомление по электронной почте в конце script каждый раз.

Разрешения следующие:

-rwxr-xr-x 1 root root     510 Mar 11 09:21 run.sh
-rwxrwxr-x 1 git git      2.8K Mar  8 10:17 script_1.php
-rwxrwxr-x 1 git git      2.6K Mar  1 18:07 script_2.php
-rwxrwxr-x 1 git git       717 Mar  1 18:07 script_3.php
-rwxrwxr-x 1 git git      6.8K Mar  4 16:30 script_4.php

Нет таких файлов журнала, как cron, таких как /var/log/cron.log, но когда я запускаю grep CRON /var/log/syslog и он возвращает следующий общий вывод:

Mar 11 06:39:01 s00000000 CRON[11651]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)
Mar 11 07:09:01 s00000000 CRON[12771]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)
Mar 11 07:17:01 s00000000 CRON[13074]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Любые предложения для вещей, которые я могу попробовать, будут оценены.

  • 0
    Как выглядят права chown / chmod в run.sh? PS: это может быть вопрос для serverfault.com. Может ли root разрешить / разрешить выполнение run.sh / script_1.php ?
  • 0
    ... а сами скрипты php ? у вас есть root-доступ к тестовому запуску /bin/bash /var/www/example.com/processors/run.sh через консоль?
Показать ещё 10 комментариев
Теги:
cron

1 ответ

1
Лучший ответ

Предварительный

  • Убедитесь, что в crontab значения SHELL и PATH настроены правильно, например:

    SHELL=/bin/bash
    PATH=/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/local/sbin:/usr/sbin
    
    • Убедитесь, что предполагаемая оболочка (например, bash) действительно используется.
    • Убедитесь, что все необходимые двоичные файлы доступны через обозначенный PATH.
  • Убедитесь, что в crontab у вас нет unescaped %. Подробнее см. man 5 crontab.
  • Возможно, вы также установили переменную окружения MAILTO на значение апробации, например:

    MAILTO="[email protected]"
    

Убедитесь, что ваш crontab работает

Еще один маленький трюк, чтобы убедиться, что ваш crontab правильно проанализирован, заключается в добавлении записи маркера в конец .

Я использую эту запись этого маркера

@daily logger -p local0.notice -t CRON '$ Id: demo 7029 2012-11-27 09: 27: 39Z dirk $'

Если запись маркера отсутствует в syslog, вы знаете, что crontab поврежден. Это может быть вызвано какой-то странной синтаксической ошибкой, которую вы не видели.

Как отладить работу cron

Если задание cron не работает, сначала проверьте результат работы.

Измените свой crontab на:

0 1 * * * /bin/bash -x /var/www/example.com/processors/run.sh >>/tmp/cronTrace 2>&1

Пожалуйста, исследуйте сгенерированный вывод script вместе с выходом трассировки (bash -x).

Дополнительная заметка

chmod +x $SCRIPTудаp >
$PHP $SCRIPT

Шаг chmod не нужен и его следует избегать. В следующей строке вы вызываете script, явно используя команду интерпретатора.

  • 0
    Можете ли вы уточнить, как добавить маркер в crontab и как проверить, правильно ли установлены значения для SHELL и PATH в crontab.
  • 0
    После того как он был запущен с регистрацией в файле, как было предложено, он создал пустой файл журнала. Нет вывода вообще.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню