让 crontab 更改其工作目录来执行 PHP 脚本

让 crontab 更改其工作目录来执行 PHP 脚本

我有一个 PHP 调度程序脚本,需要 apache 按 cron 计划执行。从命令行测试此命令效果很好:

$    ! test -e /var/www/html/maintenance.flag && cd /var/www/html/shell && /bin/php ./scheduler.php --action cron --mode default

当我以 apache 用户身份使用下面显示的命令测试此脚本或将其添加到 apache cron 时出现此错误:无法打开输入文件:./scheduler.php

$    sudo -H -u apache bash -c "! test -e /var/www/html/maintenance.flag && cd /var/www/html/shell &&  /bin/php ./scheduler.php --action cron --mode default"

请注意,scheduler.php 是一个符号链接,在链接和源文件 ( chmod ug+rwx scheduler.php ./vendor/vendor/package/src/scheduler.php) 上具有读/写/执行权限。

我最初尝试简单地运行php /var/www/html/shell/scheduler.php --action cron --mode default,但是 PHP 脚本引用了同一目录中的文件,这就是为什么我需要 apache/cron 从该目录中执行文件。

编辑

尝试使用脚本文件但仍然看到相同的错误。

创建了一个 cron.sh,内容如下:

#!/bin/bash
cd /var/www/html/shell

#For Testing - remember, this is a symlink file
ls -l 'scheduler.php'

#Run Scheduler
/bin/php ./scheduler.php --action cron --mode always
/bin/php ./scheduler.php --action cron --mode default

已测试:

sudo -H -u apache bash -c "! test -e /var/www/html/maintenance.flag && /bin/bash /var/www/html/cron.sh"

输出:

lrwxrwxrwx 1 apache webroot 53 Oct 26 10:36 scheduler.php -> ../vendor/aoepeople/aoe_scheduler/shell/scheduler.php
Could not open input file: scheduler.php
Could not open input file: scheduler.php

答案1

每个子表达式&&test...cd .../bin/php...)都在不同的子 shell 中执行,并且不能在它们之间传递上下文(如$PWD)。

不要将命令放在 中crontab,而是将其包装在一个简单的bash脚本中,然后从 调用该脚本crontab。例如:
crontab

! test -e /var/www/html/maintenance.flag && /usr/local/bin/maint

以及/usr/local/bin/maint

#!/bin/bash
cd /var/www/html/shell
/bin/php ./scheduler.php --action cron --mode default"

相关内容