繁体   English   中英

Cron执行的Bash脚本中的PHP脚本序列未运行

[英]Sequence of PHP Scripts in Bash script executed by Cron not running

我有四个PHP脚本,执行需要按顺序执行的各种任务。

而不是为每个PHP脚本创建一个cron条目,我认为我会聪明并将其包装为Bash脚本,如下所示:

#!/bin/bash

# set notification email.
NOTIFYEMAIL="webmaster@example.com"

# 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脚本,该脚本按顺序调用四个PHP脚本,通过终端手动调用,也可以正常工作。

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

但由于某种原因,当我离开cron在root用户crontab上使用以下命令运行它们时,PHP脚本不会执行。

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

我知道crontab已被处理并且Bash脚本已经运行,因为我总是在脚本结束时每次都收到通知电子邮件。

权限如下:

-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中是否正确设置了SHELLPATH的值,例如:

     SHELL=/bin/bash PATH=/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/local/sbin:/usr/sbin 
    • 确保真正使用了预期的shell(例如bash)。
    • 确保可通过表示的PATH访问所有需要的二进制文件。
  • 检查crontab中是否没有未转义的% 有关详细信息,请参阅man 5 crontab
  • 也许您还将环境变量MAILTO设置为approbate值,例如:

     MAILTO="webmaster@example.com" 

确保您的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

请调查生成的脚本输出以及跟踪输出( bash -x )。

附加说明

chmod +x $SCRIPT
$PHP $SCRIPT

chmod步骤不是必需的,应该避免。 在下一行中,您通过显式使用interpreter命令来调用脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM