使用supervisord启动PhantomJS失败,报错状态码127
我之前部署爬虫服务时也碰到过几乎一模一样的情况——手动启动一切正常,用supervisord就直接崩掉返回错误码127。结合你的场景,这大概率是环境变量、权限或者依赖路径的问题,给你几个具体的排查和解决步骤:
1. 补全Supervisord的环境变量
Supervisord启动的进程默认继承的环境变量和你手动登录shell时的不一样,很多系统库或者工具的路径没被包含进去。你可以在supervisor的配置文件(比如/etc/supervisor/conf.d/your-bot.conf)里,给你的进程显式设置PATH:
[program:your-bot] command=python3 /path/to/your/bot/script.py environment=PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/maxlunar/node_modules/phantomjs/bin" ; 其他配置项比如user、autostart等保持不变
把PhantomJS的bin目录直接加到PATH里,确保进程能找到它。
2. 验证PhantomJS的权限与可执行性
先切换到supervisord运行的用户身份(默认是root,如果你改了user配置就用对应的用户),手动执行PhantomJS看能不能正常运行:
sudo -u supervisor-user /home/maxlunar/node_modules/phantomjs/bin/phantomjs --version
如果提示权限不足,给PhantomJS添加执行权限:
chmod +x /home/maxlunar/node_modules/phantomjs/bin/phantomjs
同时要确保该用户对/home/maxlunar/node_modules/目录有读取权限。
3. 检查PhantomJS的系统依赖完整性
虽然你已经装了libfreetype6和libfontconfig,但可能还有其他依赖缺失。用ldd命令检查PhantomJS的依赖情况:
ldd /home/maxlunar/node_modules/phantomjs/bin/phantomjs
看输出里有没有标记为not found的库,比如libssl.so.1.0.0或者libicuuc.so.55这类,找到对应的包安装即可(比如Debian/Ubuntu下用apt-get install libssl1.0.0)。
4. 给Supervisord进程设置工作目录
有时候PhantomJS需要在特定工作目录下加载资源,你可以在supervisor配置里添加directory项,指定你的机器人脚本所在的目录:
[program:your-bot] directory=/path/to/your/bot/directory ; 其他配置项
5. 调整PhantomJS的启动参数
尝试给PhantomJS添加一些忽略SSL错误的参数,有时候SSL证书问题也会导致异常退出。修改你的代码:
self.utilities.update({ 'webdriver': PhantomJS( executable_path=self.phantom_path, service_args=['--ignore-ssl-errors=true', '--ssl-protocol=tlsv1', '--web-security=false'] ) })
先从环境变量和权限这两点入手排查,这是最常见的触发错误码127的原因,一般都能解决问题。
内容的提问来源于stack exchange,提问作者MaxLunar

