Cronjob执行PHP脚本时Bash命令无法执行问题排查
问题排查点
- 相对路径无法识别
Cron任务执行时的默认工作目录并非站点根目录,代码中使用的相对路径public_html/redmine/无法被正确定位,需要替换为完整绝对路径,例如/home/用户账号/public_html/redmine/。 - 环境变量缺失
Cron运行环境不会加载用户登录态的环境变量,bundle、ruby这类命令无法被直接识别,需要先通过SSH执行which bundle、which ruby获取命令的完整绝对路径,替换到命令对应位置。 - 权限不足
执行该PHP脚本的用户(一般为Cron所属用户,或是Web服务运行用户如www-data)需要满足权限要求:- 拥有
public_html/redmine目录的读写权限 - 拥有
bundle、ruby命令的执行权限 - 拥有Rails服务绑定端口、创建后台进程、生成pid文件的权限
- 若使用CentOS等默认开启SELinux的系统,需要确认SELinux策略没有禁止执行Shell命令启动服务。
- 拥有
- PHP函数被禁用
检查PHP配置文件php.ini中的disable_functions配置项,确认shell_exec函数没有被加入禁用列表,否则无法执行Shell命令。 - 缺少错误日志无法定位问题
当前代码无法捕获命令执行的报错信息,建议调整命令将输出和错误日志写入指定文件,方便排查具体报错:
$output = shell_exec('cd /完整绝对路径/public_html/redmine/ && /完整路径/bundle exec /完整路径/ruby bin/rails server -b webrick -e production -d >> /tmp/redmine_start.log 2>&1');
修改后查看/tmp/redmine_start.log即可获取命令执行的具体错误信息。
- 可选优化:添加Curl异常判断
当前代码没有处理Curl本身执行失败的场景,比如网络不通时$httpCode会返回0也会触发else分支,建议补充Curl错误判断逻辑:
if(curl_errno($handle)){ // 单独处理Curl异常,避免误触发服务重启逻辑 }
内容的提问来源于stack exchange,提问作者user14126119
相关产品推荐
相关产品推荐

