supervisor安装、配置,问题

安装

# 使用yum安装supervisor
yum install -y supervisor

配置

安装完成后会在etc下生成supervisord.conf文件和supervisord.d目录
(如果没有生成的话可以自行创建)
路径:

vim /etc/supervisord.conf
cd /etc/supervisord.d

supervisord.conf

这个文件主要是对supervisor本身的配置内容
其中[include]部分是识别监控程序的启动配置,编辑这个内容,使supervisor可以扫描并对服务完成监控

file指向配置文件存放的地址

[include]
files = supervisord.d/conf/*.conf

指定supervisor的日志存储地址
只需要修改supervisord.conf中[supervisord]下的logfile地址即可

[supervisord]
logfile=/etc/supervisord.d/supervisord.log  ; (main log file;default $CWD/supervisord.log)
......

supervisord.d

这是一个空的目录,但是我们可以把一些关于supervisor的内容放在这里面(其他的目录地址也可)
在这个目录下新建两个文件夹conf和log

cd /etc/supervisord.d
mkdir conf log

之后进入conf文件夹,把我们配置的监控脚本放进来

cd /etc/supervisord.d/conf
vim xxxxx.conf

xxxxx.conf这个文件名可以自定义命名
这里注释标识为;
编辑内容如下

[program:xxxx(这个是自定义,在supervisor中全局唯一的,用于区分服务)]
directory = /usr/local/test_back_server ; 程序的启动目录
command = java -jar runtest-0.0.1-SNAPSHOT.jar --server.port=9999 ; 启动命令,与命令行启动的命令是一样的
autostart = true     ; 在 supervisord 启动的时候也自动启动
startsecs = 3        ; 启动 3 秒后没有异常退出,就当作已经正常启动了
autorestart = true   ; 程序异常退出后自动重启
startretries = 3     ; 启动失败自动重试次数,默认是 3
user = root          ; 用哪个用户启动
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20     ; stdout 日志文件备份数
stdout_logfile = /etc/supervisord.d/log/runtest.log  ;日志统一放在log目录下

运行

supervisor有两个命令supervisordsupervisorctl

supervisord 这个主要是启动supervisor的
supervisorctl 这个主要是管理监控服务的

启动supervisor

supervisord 这个命令是全局的,随便哪个地方都可以的用
-c 后面这个内容是自己的supervisor的配置文件地址

supervisord -c /etc/supervisord.conf

操作监控项目

命令

supervisorctl

之后就会进入supervisor的bash中(exit可退出)
之后就可以根据上面配置的xxxx.conf文件中全局唯一的项目名指定操作了

stop xxxx
# 停止某一个进程(programxxx),programxxx 为 [program:beepkg] 里配置的值,这个示例就是 beepkg。
start xxxx
# 启动某个进程。
restart xxxx
# 重启某个进程。
status
# 查看进程状态。
stop all
# 停止全部进程,注:start、restart、stop 都不会载入最新的配置文件。
reload
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
update
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。

web管理页面

在supervisotd.conf中可以开启配置
对其中的[inet_http_server]的注释放开就可以
port的ip一定要是*,保证任何一台机器都可以访问
username和password就是登录web管理页的登录凭证

[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9001        ; ip_address:port specifier, *:port for all iface
username=xxx             ; default is no username (open server)
password=xxxx               ; default is no password (open server)

开启了web管理之后,supervisorctl 也需要这个凭证才能进入

开机自启动

centOS

新建supervisord.service文件
将下面的内容复制到文件中并保存
其中supervisord和supervisorctl的路径可以用which获取

which supervisord 
which supervisorctl
#supervisord.service
 
[Unit] 
Description=Supervisor daemon
 
[Service] 
Type=forking 
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf 
ExecStop=/usr/bin/supervisorctl shutdown 
ExecReload=/usr/bin/supervisorctl reload 
KillMode=process 
Restart=on-failure 
RestartSec=42s
[Install] 
WantedBy=multi-user.target

之后把文件拷贝到/usr/lib/systemd/system/下

cp supervisord.service /usr/lib/systemd/system/

启动服务

systemctl enable supervisord

验证下是否为开机自启动

systemctl is-enabled supervisord

ubuntu

编辑/etc/rc.local文件

vi /etc/rc.local

在exit 0 之前加入一下命令(supervisord是你自己机器的安装路径)

/usr/local/bin/supervisord

保存并退出
最后修改rc.local权限

chmod +x /etc/rc.local

问题

  1. ps -ef|grep 被监控的服务,出现两个在跑的进程,而且还有一个进程杀掉的时候显示不存在

如果被监控的服务在supervisor启动前就已经在跑了,此时启动supervisor,supervisor会另起一个线程跑你这个服务,但是原有的服务已经在跑了,所以会存在有两个的情况
推荐使用supervisor启动之前,把被监控的服务都先清理掉在启动supervisor

  1. Unlinking stale socket …/supervisor.sock

遇到这个问题直接按照他推荐的方法执行就行
unlink …/supervisor.sock
(unlink 就是删除单个文件)

  1. nginx无法正常启动

在启动命令后面添加-g 'daemon off;'即可

  1. nacos无法正常启动

先使用startup.sh启动
ps -ef|grep nacos 查看进程,获取实际在跑的内容(很长的一大串内容)
shotdown.sh关闭nacos
将获取的实际跑的内容使用nohup &命令启动即可

nginx和nacos的问题属于是这两个服务都属于是后台进程(在启动的时候,相当于一个异步的流程,我们所执行的命令只不过是一个标识,实际在跑的线程是之后命令自己拉起来的),所以我们使用supervisor启动检测(supervisor实际是将一个线程转为后台进程被自己监管,所以这个只能监管前台线程,对于本身就是后台线程的服务无法监管)的时候,他所检测的是标识线程,标识线程只是打印标识用的(就是启动后抛出的启动成功标识),这个会很快的结束,supervisor监控不到,认为启动失败,所以显示Exited too quickly启动失败(其他的可以查看日志师,是否是配置问题);
解决办法:
nginx:nginx官方提供了相关不以后台进程启动的方式就是以上的命令后缀
nacos:nacos官方并没有给多余的启动方式,但是nacos实际也是一个java服务,所以最终执行的语句也是一个java命令,获取到之后,直接执行就可以被supervisor托管


版权声明:本文为Orange_air原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。