我有一个 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"