首页
文章
留言
首页
文章
留言
Supervisor使用总结
2017 年 03 月 09 日
运维
Supervisor
Supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。它是通过 fork/exec 的方式把这些被管理的进程当作 supervisor 的子进程来启动,这样只要在 supervisor 的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor 还提供了一个功能,可以为 supervisord 或者每个子进程,设置一个非 root 的用户,这个用户就可以管理它对应的进程。 #### 一、安装 1、CentOS ```plaintext yum install supervisor ``` 2、Debian/Ubuntu ```plaintext apt-get install supervisor ``` 3、pip ```plaintext pip install supervisor ``` 4、easy_install ```plaintext easy_install supervisor ``` #### 二、配置 supervisor 默认配置文件:/etc/supervisord.conf 注:supervisor的配置文件默认是不全的,不过在大部分默认的情况下,上面说的基本功能已经满足。 子进程默认配置文件路径:/etc/supervisord.d/ 注:默认子进程配置文件为ini格式,可在supervisor主配置文件中修改。 ##### supervisor.conf 配置文件说明: ```plaintext [unix_http_server] # UNIX socket 文件,supervisorctl 会使用 file=/tmp/supervisor.sock # socket文件的mode,默认是0700 chmod=0700 # socket文件的owner,格式:uid:gid chown=nobody:nogroup # HTTP服务器,提供web管理界面 [inet_http_server] # Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性 port=127.0.0.1:9001 # 登录管理后台的用户名 username=user # 登录管理后台的密码 password=123 [supervisord] # 日志文件,默认是 $CWD/supervisord.log logfile=/tmp/supervisord.log # 日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小 logfile_maxbytes=50MB # 日志文件保留备份数量默认10,设为0表示不备份 logfile_backups=10 # 日志级别,默认info,其它: debug,warn,trace loglevel=info # pid 文件 pidfile=/tmp/supervisord.pid # 是否在前台启动,默认是false,即以 daemon 的方式启动 nodaemon=false # 可以打开的文件描述符的最小值,默认 1024 minfds=1024 # 可以打开的进程数的最小值,默认 200 minprocs=200 [supervisorctl] # 通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致 serverurl=unix:///tmp/supervisor.sock # 通过HTTP的方式连接supervisord serverurl=http://127.0.0.1:9001 # 包含其它配置文件 [include] # 可以指定一个或多个以.ini结束的配置文件 files = relative/directory/*.ini ``` ##### 子进程配置文件说明: 给需要管理的子进程(程序)编写一个配置文件,放在 /etc/supervisor.d/ 目录下,以 .ini 作为扩展名(每个进程的配置文件都可以单独分拆也可以把相关的脚本放一起) 如任意定义一个和脚本相关的项目名称的选项组(/etc/supervisord.d/test.conf): ```plaintext # 项目名 [program:blog] # 脚本目录 directory=/opt/bin # 脚本执行命令 command=/usr/bin/python /opt/bin/test.py # supervisor启动的时候是否随着同时启动,默认True autostart=true # 当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项:false、unexpected和true。如果为false的时候,无论什么情况下都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的 autorestart=false # 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1 startsecs=1 # 脚本运行的用户身份 user=test # 日志输出 stderr_logfile=/tmp/blog_stderr.log stdout_logfile=/tmp/blog_stdout.log # 把stderr重定向到stdout,默认 false redirect_stderr=true # stdout日志文件大小,默认 50MB stdout_logfile_maxbytes=20MB # stdout日志文件备份数 stdout_logfile_backups=20 ``` 子进程配置示例: ```plaintext [program:test] directory=/opt/bin command=/opt/bin/test autostart=true autorestart=false stderr_logfile=/tmp/test_stderr.log stdout_logfile=/tmp/test_stdout.log user=test ``` #### 三、命令 ```plaintext supervisorctl status #查看所有进程的状态,RUNNING:运行中,FATAL:运行失败,STARTING:正在启动,STOPED:任务已停止 supervisorctl stop es #停止es supervisorctl start es #启动es supervisorctl restart es #重启es supervisorctl update #配置文件修改后使用该命令加载新的配置 supervisorctl reload #重新启动配置中的所有程序 ``` 注:把 `es` 换成 `all` 可以管理配置中的所有进程。直接输入 `supervisorctl` 进入 supervisorctl 的 shell 交互界面,此时上面的命令不带 `supervisorctl` 可直接使用。 #### 四、注意事项 使用 supervisor 进程管理命令之前先启动 supervisord,否则程序报错。 使用命令 `supervisord -c /etc/supervisord.conf` 启动。 ```plaintext supervisord -c /etc/supervisord.conf supervisorctl start all ``` 若是centos7: ```plaintext # 启动supervisor并加载默认配置文件 systemctl start supervisord.service # 将supervisor加入开机启动项 systemctl enable supervisord.service ``` #### 五、常见问题 - 报错: ```plaintext unix:///var/run/supervisor.sock no such file ``` 问题描述:安装好supervisor没有开启服务直接使用supervisorctl报的错 解决办法:`supervisord -c /etc/supervisord.conf` - command中指定的进程已经起来,但supervisor还不断重启 问题描述:command中启动方式为后台启动,导致识别不到pid,然后不断重启,这里使用的是elasticsearch,command指定的是$path/bin/elasticsearch -d 解决办法:supervisor无法检测后台启动进程的pid,而supervisor本身就是后台启动守护进程,因此不用担心这个 - 启动了多个supervisord服务,导致无法正常关闭服务 问题描述:在运行 `supervisord -c /etc/supervisord.conf` 之前,直接运行过 `supervisord -c /etc/supervisord.d/xx.conf` 导致有些进程被多个superviord管理,无法正常关闭进程。 解决办法:使用 `ps -fe | grep supervisord` 查看所有启动过的supervisord服务,kill相关的进程。 - 使用supervisorctl命名报错: ```plaintext error:
,
: file: /usr/lib64/python2.7/xmlrpclib.py line: 794 ``` 解决办法:使用 `ps -fe | grep supervisord` 查看所有启动过的supervisord服务,kill相关的进程。 - 报错: ```plaintext unix:///var/run/supervisor/supervisor.sock refused connection ``` 解决办法: ```plaintext lsof -i:9001 #查看端口占用,默认端口9001,以实际端口为准 kill -9 $(lsof -i:9001|awk '{print $2}') #kill占用端口的进程 ```
0
相关文章
Linux命令总结
Docker使用总结
Kubernetes介绍
OpenResty+Lua+Kafka收集日志
Redis缓存击穿、穿透、雪崩
全部分类
前端
后端
运维
架构
算法
数据库
移动应用
桌面应用
程序开发
热门标签
Lua
OpenResty
GUI
MySQL
C++
Objective-C
Docker
MongoDB
Shell
爬虫
macOS
Python
HTML
多线程
CSS
Kubernetes
Git
Sphinx
CentOS
Qt
iOS
Android
PHP
Composer
Redis
JavaScript
Elasticsearch
Kafka
Nginx
Linux
NoSQL
Supervisor
热门文章
PHP开发之字符串处理
Redis基本使用总结
Redis、MemCache、MongoDB比较
iOS开发之面向对象
Supervisor使用总结
iOS开发之多线程
PHP使用Kafka
iOS开发之定时执行任务
macOS常用命令
OpenResty+Lua+Kafka收集日志