安装pip

下载pip安装文件并执行安装

  • 下载文件
[root@snails ~]# wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate
  • 执行安装
[root@snails ~]# python get-pip.py
[root@snails ~]# pip -V
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)

设置pip国内aliyun源

  • 创建或修改配置文件
linux ~/.pip/pip.conf
windows %HOMEPATH%\pip\pip.ini
  • 修改内容
[global]  
index-url = http://mirrors.aliyun.com/pypi/simple/  

  [install]
trusted-host=mirrors.aliyun.com  
  • 更新pip到最新版本
[root@snails ~]# pip install -U pip
  • 查看已安装的库
[root@snails ~]# pip list

安装supervisor

安装

[root@snails ~]# pip install supervisor

安装成功便可以拥有Supervisor,如果没有启动脚本,可以从 这里 下载一份,放置到 /usr/lib/systemd/system 或 /etc/systemd/system 目录(后者优先级更高)下面便可。

[root@snails ~]# wget https://raw.githubusercontent.com/Supervisor/initscripts/master/centos-systemd-etcs -O /usr/lib/systemd/system/systemd-supervisor.service

配置

通过Supervisor附送的贴心的小脚本生成默认的配置文件

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

我们可以根据需要修改里面的配置。我这里,每个不同的项目,使用了一个单独的配置的文件,放置在 /etc/supervisor/下面,于是修改 /etc/supervisord.conf ,加上如下内容:

[include]
files = /etc/supervisor/*.conf

创建golang http服务

为了测试方便,我这里用一个最简单的golang http服务。

[root@snails ~]# vi ~/simple_http_server.go
package main

 import (
    "fmt"
    "log"
    "net/http"
)

 func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello world\n")
    })

    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

直接运行这个程序会占用住终端,下面看看如何用supervisor来跑这个程序。

创建golang服务对应的supervisor配置文件

vi /etc/supervisor/golang.conf
[program:golang-http-server]
command=/root/simple_http_server
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/simple_http_server.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/simple_http_server.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
  • 几个配置说明:
command:表示运行的命令,填入完整的路径即可。autostart:表示是否跟随supervisor一起启动。autorestart:如果该程序挂了,是否重新启动。stdout_logfile:终端标准输出重定向文件。stderr_logfile:终端错误输出重定向文件。

启动supervisor

[root@snails ~]# /usr/bin/supervisord -c /etc/supervisord.conf

如果出现什么问题,可以查看日志进行分析,日志文件路径/tmp/supervisord.log

tips:如果修改了配置文件,可以用kill -HUP重新加载配置文件

[root@snails ~]# cat /tmp/supervisord.pid | xargs sudo kill -HUP

查看supervisor运行状态

[root@snails ~]# supervisorctl
golang-http-server               RUNNING   pid 30343, uptime 0:00:55

* 输入help可以查看帮助

supervisor> help
default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail   
avail  fg        pid   remove  shutdown  status  update 
clear  maintail  quit  reread  signal    stop    version

supervisor运行原理

supervisor运行后本身是守护进程,通过自身来管理相应的子进程,通过观察相应的进程状态就很明了。

[root@snails ~]# ps -ef | grep supervisord
root     30269     1  0 11:31 ?        00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
[root@snails ~]# ps -ef | grep simple_http_server
root     30343 30269  0 11:45 ?        00:00:00 /root/simple_http_server

可以很直观的看出golang simple_http_server进程是supervisord的子进程。

supervisor是否靠谱

supervisor的诞生已经10年了,现在是3+版本,所以放心使用吧。

升级Supervisor

升级Supervisor也是非常简单的,使用 pip install --upgrade supervisor
既可以更新程序,然后使用 systemctl restart systemd-supervisor
重启一下,就可以升级完成。

验证

[root@snails ~]# systemctl enable systemd-supervisor
[root@snails ~]# systemctl status systemd-supervisor
[root@snails ~]# curl localhost:9090
Hello world