使用Supervisor实现Linux守护进程

本文作者:陈进坚
博客地址:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
联系方式:[email protected]

前言

做过系统软件开发的人都会遇到,如果写好的程序需要在Linux后台运行时不太好处理,用nohup&放到后台的话,很难对线程进行停止和重启操作。Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的实现启动、重启、关闭进程、意外停止自动重启、日志分割等功能。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动,同时Supervisor 提供web管理页面可以进行远程管理,非常方便。

安装supervisor

Centos

[root@ztg ~]# yum install epel-release	#如果已经有python环境可以跳过前两步
[root@ztg ~]# yum install -y python-pip
[root@ztg ~]# pip install supervisor

Ubuntu

[root@ztg ~]# apt-get install supervisor

配置supervisor

生成配置文件

[root@ztg ~]# echo_supervisord_conf > /etc/supervisord.conf

如果出现下面的错误

Traceback (most recent call last):
  File "/usr/bin/supervisord", line 5, in 
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in 
    working_set.require(__requires__)
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: meld3>=0.6.5

请以此执行下面4行命令再生成配置文件

[root@ztg ~]# wget https://pypi.python.org/packages/source/m/meld3/meld3-1.0.2.tar.gz
[root@ztg ~]# tar -zxf meld3-1.0.2.tar.gz
[root@ztg ~]# cd meld3-1.0.2
[root@ztg ~]# python setup.py install

编辑/etc/supervisord.conf,在最后增加要自定义运行程序的配置信息:(举例的httpserver是用golang实现的简单的http服务程序)

[root@ztg ~]# vi /etc/supervisord.conf
[program:httpserver]
command=/bin/bash -c "/home/ztg/httpserver"
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/go_http_server_info.log
stdout_logfile_maxbytes=2MB
stdout_logfile_backups=30
stdout_capture_maxbytes=2MB
stderr_logfile=/var/log/go_http_server_error.log
stderr_logfile_maxbytes=2MB
stderr_logfile_backups=30
stderr_capture_maxbytes=2MB

配置说明

[program:程序名]
command=/bin/bash -c "需要执行的命令,多句命令用分号隔开"
autostart=true 是否跟随supervisor一起启动
autorestart=true 如果该程序挂了,是否重新启动
startsecs=10
stdout_logfile=/var/log/go_http_server_info.log  终端标准输出重定向文件
stdout_logfile_maxbytes=2MB	文件最大大小
stdout_logfile_backups=30	文件备份最大数量
stdout_capture_maxbytes=2MB	
stderr_logfile=/var/log/go_http_server_error.log	终端错误输出重定向文件
stderr_logfile_maxbytes=2MB
stderr_logfile_backups=30
stderr_capture_maxbytes=2MB

操作supervisor

启动supervisor,使用默认配置文件:

$ supervisord

或者指定配置文件:

$ /usr/bin/supervisord -c /etc/supervisord.conf

启动supervisor之后可以执行supervisorctl相关命令

supervisorctl 常用命令:

命令 说明
supervisorctl stop program_name 停止某个进程
supervisorctl start program_name 启动某个进程
supervisorctl restart program_name 重启某个进程
supervisorctl stop all 停止全部进程
supervisorctl reload 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl update 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

查看运行状态并进入控制台,在控制台中执行命令可以省去supervisorctl命令

$ supervisorctl
httpserver                       RUNNING   pid 34236, uptime 0:00:28
supervisor> stop httpserver
httpserver: stopped

Web管理页面

supervisor提供了可视化的Web管理页面,允许远程操作,但是需要在配置文件手动打开。

打开配置文件

$ vi /etc/supervisord.conf

将下面几行前面的分号去掉,修改一下数据保存退出

[inet_http_server]         ; HTTP 服务器,提供 web 管理界面
port=192.168.1.194:9001    ; Web 管理后台运行的 IP 和端口,如果开放到公网,需要注意安全性
username=user              ; 登录管理后台的用户名
password=123               ; 登录管理后台的密码

重新载入配置

$ supervisorctl reload

在浏览器打开刚刚配置的ip和端口(192.168.1.194:9001)即可弹出登录框进入管理页面。

查看日志

访问配置文件中定义的日志文件即可

$ tail -f /var/log/go_http_server_info.log
$ tail -f /var/log/go_http_server_error.log

你可能感兴趣的:(Go语言)