У меня есть четыре скрипта 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)
Любые предложения для вещей, которые я могу попробовать, будут оценены.
Убедитесь, что в crontab значения SHELL
и PATH
настроены правильно, например:
SHELL=/bin/bash
PATH=/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/local/sbin:/usr/sbin
PATH
.%
. Подробнее см. man 5 crontab
.Возможно, вы также установили переменную окружения MAILTO
на значение апробации, например:
MAILTO="[email protected]"
Еще один маленький трюк, чтобы убедиться, что ваш crontab правильно проанализирован, заключается в добавлении записи маркера в конец .
Я использую эту запись этого маркера
@daily logger -p local0.notice -t CRON '$ Id: demo 7029 2012-11-27 09: 27: 39Z dirk $'
Если запись маркера отсутствует в syslog, вы знаете, что crontab поврежден. Это может быть вызвано какой-то странной синтаксической ошибкой, которую вы не видели.
Если задание 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, явно используя команду интерпретатора.
SHELL
и PATH
в crontab.
root
разрешить / разрешить выполнениеrun.sh
/script_1.php
?php
? у вас есть root-доступ к тестовому запуску/bin/bash /var/www/example.com/processors/run.sh
через консоль?