安装
# 使用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有两个命令supervisord和supervisorctl
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
问题
- ps -ef|grep 被监控的服务,出现两个在跑的进程,而且还有一个进程杀掉的时候显示不存在
如果被监控的服务在supervisor启动前就已经在跑了,此时启动supervisor,supervisor会另起一个线程跑你这个服务,但是原有的服务已经在跑了,所以会存在有两个的情况
推荐使用supervisor启动之前,把被监控的服务都先清理掉在启动supervisor
- Unlinking stale socket …/supervisor.sock
遇到这个问题直接按照他推荐的方法执行就行
unlink …/supervisor.sock
(unlink 就是删除单个文件)
- nginx无法正常启动
在启动命令后面添加
-g 'daemon off;'即可
- 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托管