这里会显示出您选择的修订版和当前版本之间的差别。
jaysnote:supervisor_not_start [2019/01/29 15:25] jaylee 创建 |
jaysnote:supervisor_not_start [2021/06/22 23:14] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | < | ||
- | # supervisor not start | ||
- | |||
- | supervisor启动失败,通过`/ | ||
- | |||
- | ```bash | ||
- | supervisor[2124]: | ||
- | systemd[1]: Starting System Logging Service... | ||
- | systemd[1]: Starting Permit User Sessions... | ||
- | zabbix-agent[2122]: | ||
- | systemd[1]: Started Advanced key-value store. | ||
- | systemd[1]: Started LSB: Start zabbix-agent daemon. | ||
- | systemd[1]: Started LSB: Starts and stops Wicd. | ||
- | systemd[1]: supervisor.service: | ||
- | systemd[1]: Failed to start LSB: Start/stop supervisor. | ||
- | systemd[1]: Unit supervisor.service entered failed state. | ||
- | ``` | ||
- | |||
- | 该报错通过systemd控制的sysv init启动脚本报出。从直接报错的代码位置来看是`start-stop-daemon`启动`supervisord` 失败。 | ||
- | |||
- | ```bash | ||
- | case " | ||
- | | ||
- | echo -n " | ||
- | | ||
- | | ||
- | test -f $PIDFILE || sleep 1 | ||
- | if running ; then | ||
- | echo " | ||
- | else | ||
- | echo " ERROR." | ||
- | fi | ||
- | ;; | ||
- | ``` | ||
- | |||
- | 为什么这里会启动进程失败呢?通过`man start-stop-daemon` 找到了可能的报错原因。 | ||
- | |||
- | ```bash | ||
- | DESCRIPTION | ||
- | | ||
- | Note: unless --pid or --pidfile are specified, start-stop-daemon behaves similar to killall(1). | ||
- | COMMANDS | ||
- | -S, --start [--] arguments | ||
- | Check for the existence of a specified process. | ||
- | ``` | ||
- | |||
- | ```bash | ||
- | 描述: | ||
- | start-stop-daemon 用以控制系统级别进程启动和终止,同时也可以用以配置发现已经存在的进程。 | ||
- | 注意:除非指定了--pid 或者--pidfile 选项,否则start-stop-daemon 表现行为类似killall, start-stop-daemon 将扫描所有进程表查找是否匹配进程名,父进程id,uid,和/ | ||
- | 命令: | ||
- | -S, --start [--] arguments | ||
- | 检查指定进程是否存在,如果存在一个进程start-stop-daemon 将不会做任何事情,返回错误状态为1(如果指定 --oknod 将会返回0),如果不存在指定进程id,将会启动守护进程,进程名通过--exec或者--startas 指定,任何在-- 符号后指定的参数将会直接传递给新启动进程实例。 | ||
- | ``` | ||
- | |||
- | |||
- | |||
- | 通过如上分析可以知道这里可能存在了`--pidfile` 指定的进程id,尝试更改`/ | ||
- | |||
- | 那么这里为什么会出现相同进程id的进程名呢? | ||
- | |||
- | 通过分析这里设备可能存在异常断电导致设备未正常销毁pid文件,再次启动的时候又检测到相同pid的进程名,所以直接导致了进程的启动失败。 | ||
- | |||
- | pidfile单例模式启动进程这么通用的机制为什么会出现该缺陷?其他守护进程也会出现?还是只是概率问题。 | ||
- | |||
- | 其实不然,以下分析。 | ||
- | |||
- | ## sysv init single instance | ||
- | |||
- | 在[systemd# | ||
- | |||
- | 同时高版本的supervisor(3.3.5) 的pid文件路径从`/ | ||
- | |||
- | ```bash | ||
- | $ df -lh | ||
- | Filesystem | ||
- | / | ||
- | tmpfs | ||
- | ``` | ||
- | |||
- | |||
- | |||
- | 如上,对于sysv init 出现的supervisor启动失败,直接原因是早期版本把`--pidfile` 文件放在了`/ | ||
- | |||
- | 同时,`--pidfile` 文件路径直接用sysvinit (`/ | ||
- | |||
- | ```bash | ||
- | $ cat / | ||
- | [supervisord] | ||
- | logfile=/ | ||
- | pidfile=/ | ||
- | ``` | ||
- | |||
- | |||
- | |||
- | </ |