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

Tyl*_*sSN 5 php command-line bash cron apache2

我有一个 PHP 调度程序脚本,我需要 apache 来按 cron 计划执行。从命令行测试此命令工作正常:

$    ! test -e /var/www/html/maintenance.flag && cd /var/www/html/shell && /bin/php ./scheduler.php --action cron --mode default
Run Code Online (Sandbox Code Playgroud)

当我使用下面显示的命令作为我的 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"
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

测试:

sudo -H -u apache bash -c "! test -e /var/www/html/maintenance.flag && /bin/bash /var/www/html/cron.sh"
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

wal*_*tor 6

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

而不是在你把你的命令crontab,将它包装在一个简单的bash脚本,并调用从脚本crontab。例如:
crontab

! test -e /var/www/html/maintenance.flag && /usr/local/bin/maint
Run Code Online (Sandbox Code Playgroud)

并且,在/usr/local/bin/maint

#!/bin/bash
cd /var/www/html/shell
/bin/php ./scheduler.php --action cron --mode default"
Run Code Online (Sandbox Code Playgroud)