supervisor运行golang守护进程

Easter79
• 阅读 511

Supervisor是一个C/S系统,它可以在类UNIX系统上控制系统进程,由python编写,它提供了大量的功能来实现对进程的管理。

  • 程序的多进程启动,可以配置同时启动的进程数,而不需要一个个启动
  • 程序的退出码,可以根据程序的退出码来判断是否需要自动重启
  • 程序所产生日志的处理
  • 进程初始化的环境,包括目录,用户,umask,关闭进程所需要的信号等等
  • 手动管理进程(开始,启动,重启,查看进程状态)的web界面,和xmlrpc接口

支持的平台

  • 可以运行在大多数类UNIX系统上,比如Linux、MAC OS X、Solaris、FreeBSD。
  • 不支持任何版本的Windows。
  • 支持Python2.4以及之后的版本,但不支持Python3。

安装supervisor

  • pip

    pip install supervisor
    
  • easy_install

    easy_install supervisor
    
  • apt-get (Debian/Ubuntu)

    apt-get update
    apt-get install supervisor
    #默认配置文件在/etc/supervisor/supervisord.conf
    
  • yum (Centos)

    yum install supervisor
    

golang http服务

先整一个简单的golang http服务

package main
 
import (
    "fmt"
    "log"
    "net/http"
)
 
func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello world")
    })
 
    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

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

supervisor配置golang

编辑/etc/supervisord.conf,在最后增加运行程序设置

[program:golang-http-server]
command=/home/golang/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

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

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

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

$ cat /tmp/supervisord.pid | xargs sudo kill -HUP

查看supervisor运行状态

$ supervisorctl
golang-http-server RUNNING pid 23307, uptime 0:02:55
supervisor>

输入help可以查看帮助

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

supervisor运行原理

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

$ ps -ef | grep supervisord
root 23306 1 0 07:30 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 23331 23222 0 07:41 pts/0 00:00:00 grep supervisord

$ ps -ef | grep simple_http_server
root 23307 23306 0 07:30 ? 00:00:00 /home/golang/simple_http_server
root 23333 23222 0 07:41 pts/0 00:00:00 grep simple_http_server

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

常用命令

控制命令基本都通过supervisorctl执行,输入 help 可以看到命令列表。这是一些常用命令:

  • 获得所有程序状态 supervisorctl status
  • 关闭目标程序 supervisorctl stop spider
  • 启动目标程序 supervisorctl start spider
  • 关闭所有程序 supervisorctl shutdown

让 Supervisor 开机启动

echo "service supervisord start" >> /etc/rc.local

supervisor是否靠谱

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

参考

supervisor官网:http://supervisord.org/

开机启动: https://github.com/Supervisor/initscripts

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Wesley13 Wesley13
2年前
supervisor 管理进程
supervisor管理进程说明Supervisor是一个用Python写的进程管理工具,可以很方便的用来启动、重启、关闭进程.安装pipinstallsupervisor配置echo_supervisord_conf/etc/s
Easter79 Easter79
2年前
Supervisor中启动netcore网站
1.安装配置Supervisorsupervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具。可以很方便的监听、启动、停止、重启一个或多个进程。用supervisor管理的进程,当一个进程意外被杀死,supervisor监听到进程死后,会自动将它重启,很方便的做到进程自动恢复的功
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
稚然 稚然
2个月前
探索Android底层开发
//下仔のke:https://yeziit.cn/15444/在Unix和Linux系统中,init是系统启动后由内核首先启动的用户级进程,其进程ID(PID)始终为1。init进程负责启动和管理系统服务、配置系统环境以及处理系统或服务的终止等任务。在现
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k