【问题标题】:Sequence of PHP Scripts in Bash script executed by Cron not runningCron 执行的 Bash 脚本中的 PHP 脚本序列未运行
【发布时间】:2013-02-26 10:11:24
【问题描述】:

我有四个 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

我什至测试了通过终端手动依次调用四个 PHP 脚本的 bash 脚本,它也可以正常工作。

/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)

如有任何建议让我尝试,我们将不胜感激。

【问题讨论】:

  • run.sh 的 chown/chmod 权限如何? PS:可能是serverfault.com的问题root能够/允许执行run.sh/script_1.php吗?
  • ... 和 php 脚本本身?您是否有通过控制台对 test-run /bin/bash /var/www/example.com/processors/run.sh 进行 root 访问?
  • root 应该有权运行所有内容吗?
  • @simplyray 我已经更新了这些文件的权限。我使用 Git 和 chmod +x 在 Bash 脚本中的文件上部署站点。
  • @paperclip: 嗯好吧.../var/log 下的 crontab 的任何错误日志条目?

标签: php bash ubuntu cron


【解决方案1】:

初步

  • 检查 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 设置为认可值,例如:

    MAILTO="webmaster@example.com"
    

确保您的 crontab 工作正常

另一个确保您的 crontab 被正确解析的小技巧是在 end 处添加一个 marker 条目。

我正在使用自己的这个标记条目

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

如果系统日志中缺少标记条目,您就知道 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 步骤不是必需的,应该避免。 在下一行中,您通过显式使用解释器命令来调用脚本。

【讨论】:

  • 您能否详细说明在 crontab 中添加标记以及如何检查 crontab 中 SHELLPATH 的值是否设置正确。
  • 按照建议让它运行并记录到文件后,它创建了一个空的日志文件。根本没有输出。
  • @paperclip 这只有在脚本文件为空时才有可能。如果脚本文件至少有一行(无注释),则使用 -x 选项对其进行跟踪。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 2018-07-05
  • 2012-02-07
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多