centos7使用rc.local做开机启动,必须添加rc.local的可执行权限
在生产环境,使用Supervisor管理各类程序。发现有一个服务,开机后不能正常启动,手动执行却可以成功。思考开机启动和手动启动可能存在的差别,分析如下:
1,执行用户,都是root
2,执行路径,命令启动使用绝对路径,应该不存在路径问题
3,启动时环境变量的不同。感觉很有可能,但不知道是哪个变量的影响
应该有一个方法,删除当前的所有环境变量,让手动启动的环境和开机时的环境 一致。但是,我不知道。
只能再从Supervisor
身上去想想办法。
文档是最好的老师,当然有中文的才更好
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024 ;可以打开的文件描述符的最小值,默认 1024
minprocs=200 ;可以打开的进程数的最小值,默认 200
loglevel,之前的log里只记录启动失败,没有失败的原因。推测应该是默认的级别是info
,信息不全。好吧,改成debug
,再次重启系统,最终原因浮出水面。
2017-03-31 14:58:20,555 DEBG fd 11 closed, stopped monitoring <POutputDispatcher at 140252173025792 for <Subprocess at 140252173597584 with name php in state STARTING> (stdout)>
2017-03-31 14:58:20,636 DEBG 'emqttd' stderr output:
erlexec: HOME must be set
原来是 HOME 变量,使用export
命令查看到当前的信息HOME=/root
,所以增加以下命令在启动脚本中
export HOME=/root
重启,OK,当然,最后还要是把 loglevel的级别调成info
不问程序为什么使用这个变量,只管通过方法,解决了这个问题