首页
文章
留言
首页
文章
留言
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
相关文章
Redis缓存击穿、穿透、雪崩
Linux命令总结
CentOS常用命令总结
Kubernetes介绍
Docker使用总结
全部分类
前端
后端
运维
架构
算法
数据库
移动应用
桌面应用
程序开发
热门标签
Redis
爬虫
Shell
CSS
JavaScript
Nginx
Qt
Kubernetes
Elasticsearch
OpenResty
macOS
NoSQL
Python
HTML
Git
Supervisor
iOS
CentOS
Lua
PHP
Objective-C
Docker
Android
MongoDB
GUI
多线程
C++
Composer
MySQL
Kafka
Sphinx
Linux
热门文章
Redis、MemCache、MongoDB比较
macOS常用命令
OpenResty+Lua+Kafka收集日志
Nginx常用配置说明
Elasticsearch详解
Supervisor使用总结
Docker使用总结
Git使用总结
CentOS常用命令总结
Qt实现TCP通讯