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)
到&&
( 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)