pap*_*lip 5 php bash ubuntu cron
我有四个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
Run Code Online (Sandbox Code Playgroud)
我已经单独测试了所有脚本,并且它们正常工作,将处理信息输出到终端.
/usr/bin/php /var/www/example.com/processors/script_1.php
Run Code Online (Sandbox Code Playgroud)
我甚至测试了bash脚本,该脚本按顺序调用四个PHP脚本,通过终端手动调用,也可以正常工作.
/bin/bash /var/www/example.com/processors/run.sh
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,当我离开cron在root用户crontab 上使用以下命令运行它们时,PHP脚本不会执行.
# process daily.
0 1 * * * /bin/bash /var/www/example.com/processors/run.sh > /dev/null
Run Code Online (Sandbox Code Playgroud)
我知道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
Run Code Online (Sandbox Code Playgroud)
没有特定于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)
Run Code Online (Sandbox Code Playgroud)
任何建议让我尝试的将不胜感激.
检查 crontab 中 和 的值SHELL
是否PATH
设置正确,例如:
SHELL=/bin/bash
PATH=/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/local/sbin:/usr/sbin
Run Code Online (Sandbox Code Playgroud)
PATH
.%
检查crontab 中是否有未转义的字符。man 5 crontab
详情请参阅。也许您还将环境变量设置MAILTO
为合适的值,例如:
MAILTO="webmaster@example.com"
Run Code Online (Sandbox Code Playgroud)确保正确解析crontab的另一个小技巧是在末尾添加一个标记条目。
我自己使用这个标记条目
@daily logger -p local0.notice -t CRON '$Id: demo 7029 2012-11-27 09:27:39Z dirk $'
如果系统日志中缺少标记条目,您就知道crontab已损坏。这可能是由一些您没有见过的奇怪的语法错误触发的。
如果 cron 作业不起作用,请首先调查作业输出。
将您的 crontab 更改为:
0 1 * * * /bin/bash -x /var/www/example.com/processors/run.sh >>/tmp/cronTrace 2>&1
Run Code Online (Sandbox Code Playgroud)
请研究生成的脚本输出以及跟踪输出 ( bash -x
)。
chmod +x $SCRIPT
$PHP $SCRIPT
该chmod
步骤不是必需的,应该避免。在下一行中,您通过显式使用解释器命令来调用脚本。
归档时间: |
|
查看次数: |
1297 次 |
最近记录: |