OVH服务器PHP CRON定时任务执行报错Exitcode 255求助
看起来你遇到的是OVH服务器上Cron环境与手动运行环境不一致导致的问题,我之前在OVH部署定时任务时也踩过类似的坑,给你几个针对性的排查和解决方向:
1. 先排查路径一致性问题
从你的日志和代码来看,Cron执行的脚本路径是/home.XXX/name/path/cron.php,但你include的数据库文件路径是/home/name/path/bdd.php——这里的home.XXX和home明显不一致!OVH的用户目录通常是/home/你的用户名/,所以你应该把include路径改成和Cron脚本一致的绝对路径,比如:
include('/home.XXX/name/path/bdd.php');
手动运行时你可能在脚本所在目录,相对路径或者不完整的绝对路径能生效,但Cron是在系统根环境下执行,路径差一点都会找不到文件,这是最常见的触发exitcode 255的原因。
2. 给Cron任务添加详细错误日志
Exitcode 255只是个笼统的报错码,看不到具体错误内容就很难精准定位。修改你的Cron命令,把标准输出和错误输出都重定向到日志文件:
0 0 * * * /usr/local/php7.3/bin/php /home.XXX/name/path/cron.php >> /home.XXX/name/path/cron_debug.log 2>&1
等Cron执行后,打开cron_debug.log就能看到具体的报错信息(比如找不到文件、数据库连接失败、权限不足等),这能帮你快速锁定问题。
3. 确保Cron的执行环境和手动一致
Cron的环境变量比你SSH登录后的环境少很多,比如PHP的配置、环境变量可能存在差异。可以试试在脚本开头加上这几行,强制设置执行目录为脚本所在目录,并单独记录PHP错误:
chdir(dirname(__FILE__)); // 切换到脚本所在目录,避免相对路径问题 error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('log_errors', 1); ini_set('error_log', '/home.XXX/name/path/php_errors.log'); // 单独记录PHP错误日志
另外,也可以在Cron命令前加载用户环境,让Cron用你手动登录时的环境执行脚本:
0 0 * * * su - 你的用户名 -c "/usr/local/php7.3/bin/php /home.XXX/name/path/cron.php >> /home.XXX/name/path/cron_debug.log 2>&1"
4. 检查数据库连接的权限问题
手动运行时用的是你的用户权限,Cron执行时可能存在数据库连接的问题:
- 检查
bdd.php里的数据库连接地址,如果用的是localhost,可以换成127.0.0.1试试(有些环境下localhost会解析到socket,而Cron环境可能找不到socket路径); - 确保数据库用户允许从本地(127.0.0.1)连接,并且密码配置正确;
- 如果
bdd.php里用了环境变量读取密码(比如getenv('DB_PWD')),要确保Cron环境能读到这个变量——可以在Cron命令里直接定义,比如:
0 0 * * * DB_PWD=你的数据库密码 /usr/local/php7.3/bin/php /home.XXX/name/path/cron.php >> /home.XXX/name/path/cron_debug.log 2>&1
5. 验证文件和目录权限
确保脚本和数据库配置文件的权限正确,避免Cron执行时因为权限不足无法读取文件:
chmod 755 /home.XXX/name/path/ # 给目录添加执行权限 chmod 644 /home.XXX/name/path/cron.php /home.XXX/name/path/bdd.php # 给文件添加读权限
先从路径问题开始排查,这应该是最可能的原因,然后结合错误日志来进一步定位!
备注:内容来源于stack exchange,提问作者Yosu

