前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >supervisor简单使用

supervisor简单使用

作者头像
dogfei
发布2020-07-31 11:33:20
4610
发布2020-07-31 11:33:20
举报
文章被收录于专栏:devops探索devops探索

介绍

Supervisor 是用Python开发的一套通用的进程管理程序,是Linux/Unix系统下的一个进程管理工具。可以很方便的监听、启动、停止、重启一个或多个进程。能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启,用supervisor管理的进程,当一个进程意外被杀死,supervisor监听到进程死后,会自动将它重启,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

安装

yum方式

代码语言:javascript
复制
yum install -y epel-release
yum install -y supervisor

apt方式

代码语言:javascript
复制
sudo apt install supervisor

pip方式

代码语言:javascript
复制
pip3 install  supervisor
mkdir supervisor/{logs,run,supervisor.d} -p
echo_supervisord_conf > /etc/supervisord.conf

没有pip则需要自行查找安装,另外使用pip安装的没有用systemd去管理,这里加入systemd

代码语言:javascript
复制
# cat /usr/lib/systemd/system/supervisord.service 
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/local/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target


配置无误后执行
systemctl daemon-reload
systemctl start supervisord

基本使用

安装完成后,默认配置文件是在/etc/supervisor下

代码语言:javascript
复制
$ tree /etc/supervisor/
/etc/supervisor/
├── conf.d
└── supervisord.conf

配置文件参考

代码语言:javascript
复制
[root@cicd /usr/local/supervisor]# egrep -v "^;|^$" supervisord.conf
[unix_http_server]
file=/usr/local/supervisor/run/supervisor.sock   ; the path to the socket file
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/usr/local/supervisor/run/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///usr/local/supervisor/run/supervisor.sock ; use a unix:// URL  for a unix socket
[include]
files = supervisor.d/*.conf

可以写各种子配置文件,来达到对多服务,多进程的监控,配置非常简单,下面是一些参数配置参考

打开子配置文件

代码语言:javascript
复制
vim /etc/supervisord.conf
[include]
files = supervisord.d/*.conf

systemctl restart supervisord

nginx示例

代码语言:javascript
复制
command=nginx  ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=nginx         ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
stdout_logfile=/var/log/supervisor_test/test.log    #当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程

下面我们以nginx为例,来配置一下Nginx的守护进程。

代码语言:javascript
复制
cat /etc/supervisor/conf.d/nginx.conf
[program:nginx]
command=/usr/sbin/nginx    #这里会有问题吗?
autostart=true
startsecs=10
autorestart=true
startretries=3
user=root
priority=100
redirect_stderr=true
stdout_logfile_maxbytes=20MB
strout_logfile=/var/log/supervisor_test/nginx.log
stopasgroup=false
killasgroup=false

配置完成后,我们重启下supervisor服务

代码语言:javascript
复制
sudo systemctl restart supervisor.service
sudo systemctl enable supervisor.service    #加入到开机启动

启动之后,我们检查下所监控的服务状态

代码语言:javascript
复制
$ sudo supervisorctl status
nginx                            FATAL     Exited too quickly (process log may have details)

发现启动错误,这是为什么呢?查看nginx状态,发现了一些端倪

这里我们发现,nginx在启动时,默认就是放在后台,所以supervisor便做不到了。

:supervisor不能监控后台进程,command 不能为后台运行命令

修改后如下:

代码语言:javascript
复制
# cat /etc/supervisor/conf.d/nginx.conf 
[program:nginx]
command=/usr/sbin/nginx -g 'daemon off;'
autostart=true
startsecs=10
autorestart=true
startretries=3
user=root
priority=100
redirect_stderr=true
stdout_logfile_maxbytes=20MB
strout_logfile=/var/log/supervisor_test/nginx.log
stopasgroup=false
killasgroup=false

我们强杀nginx,看下有什么变化

代码语言:javascript
复制
killall nginx

查看supervisor日志

再次查看nginx

命令使用

代码语言:javascript
复制
supervisorctl 是 supervisord的命令行客户端工具
supervisorctl status:查看所有进程的状态
supervisorctl stop nginx:停止nginx
supervisorctl start nginx:启动nginx
supervisorctl restart nginx: 重启nginx
supervisorctl update :配置文件修改后可以使用该命令加载新的配置
supervisorctl reload: 重新启动配置中的所有程序

启停服务

代码语言:javascript
复制
启动:
supervisord -c supervisord.conf

关闭:
supervisorctl shutdown

以上就是supervisor的简单应用,后续再加上其他服务的配置

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 安装
  • 基本使用
  • 命令使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档