supervisor 是一个可以管理进程的软件,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。比如我们要用它管理elasticsearch 就可以把管理es的专属用户密码 写入配置文件。
- 网上有很多supervisor的安装教程,也比较简单。这里就不再赘述。开始使用的时候需要先看一看 配置文件 路径:/etc/supervisord.conf 。
因为我们可能会用 supervisor 管理很多进程 写在一个文件会很大,所以通常需要 每一个 进程独立出一个 以 .ini 为后缀的配置文件 单独管理。
按照配置文件默认的加载路径 supervisord.d/ 下创建了 elasticsearch.ini 文件。
command=/usr/local/elasticsearch-6.6.1/bin/elasticsearch ; 运行程序的命令
autorestart=true ; 程序意外退出是否自动重启 autostart=true ; 是否自动启动 stderr_logfile=/var/log/supervisor/elasticsearch_err.log ; 错误日志文件 stdout_logfile=/var/log/supervisor/elasticsearch_out.log ; 输出日志文件 environment=JAVA_HOME=/usr/local/jdk1.8.0_201 ; 进程环境变量 user=ela ; 进程执行的用户身份 password=ela stopsignal=INT startsecs=10 ; 自动重启间隔写入上图中的配置信息(当时没有写 environment JAVA_HOME 的配置)
所以 执行 supervisorctl reload 、 supervisorctl restart elasticsearch 总是失败。
2、开始排错 (在坑里的感觉真不好)
第一个直觉就是去查看 supervisor的日志了 以为 elasticsearch 根本就没启动 也不会输出 日志
所以一直在查 exit status 1; not expected elasticsearch entered FATAL state, too many start retries too quickly 这个问题 ,然后 会发现管理很多其他的 进程 出错时也会 报这种错 也试了很多 搜到的 解决方法 ,但是结果肯定都不适用。
3、出坑
找解决方法找的 都眼疼了 。 偶然的契机我去 看了眼 elasticsearch.ini 配置文件中 指定的 输出日志 和 错误 输出日志 。惊奇的发现 人家已经默默滴 记录了好多日志啦(手动捂脸) 。
所以 直接打开 error 日志
所以 真相浮出水面 直接去配置文件添加 JAVA_HOME 环境变量 再重新reload 、 start 终于运行了。