supervisor 进程管理

我们想让linux跑一个项目,例如一个web项目,希望这个web项目以守护进程的模式一直在上面跑,即使重启服务器,发生了异常扔能安全运行,或者告知我们进程发生了异常,这个时候我们可以考虑Python编写的supervisor 进程管理

举个简单的例子,我们用gin起一个简单的http服务
代码

package main

import "github.com/gin-gonic/gin"
func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "hello",
        })
    })
    r.Run(":8080")
}

运行


image.png

我们只要在终端执行 go run main.go 就可以监听8080端口 提供http服务,但是 一旦按下ctrl + c 或者退出终端,我们的go进程就会退出

但是我们希望它能一直在后台跑,这个时候我们可以使用nohup xxx &的方式起一个守护进程
例如上面的go run main.go可以改进为

[root@localhost demo]# nohup go run main.go &
[1] 2922
[root@localhost demo]# nohup: 忽略输入并把输出追加到"nohup.out"

image.png

这个时候终端的io输出就会重定向到nohup.out 即当前目录的nohup.out 文件中,并返回进程号,我们看下当前目录 并查看一下进程号
查看当前目录

image.png

查看 nohup.out文件


image.png

明显的看到输出都写入到该文件中了
我们查看一下进程号


image.png

从而实现了守护进程,一切看起来好像很完美了
但是仍然有几个问题需要处理
问题一 服务器重启了怎么办
问题二 nohup.out越来越大 不好管理
问题三 进程由于某些意外 被杀死 或者需要滑动重启怎么办
问题四 进程出现异常 我们不得而知 没有监控 无法管理

这个时候就需要引入我们的主角supervisor

Supervisor是用Python开发的一套通用的进程管理程序,
能将一个普通的命令行进程变为后台daemon,并监控进程状态,
异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,
这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。
也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。

安装
yum install supervisor -y

安装完成后
配置文件的目录位于:
/etc/supervisord.conf 主配置文件
/etc/supervisor.d/ 默认子进程配置文件,我们的开头的web进程就可以放这里了
supervisord.conf 基本配置项说明
前面带有;则表示注释 跟nginx配置文件的#一个意思

[unix_http_server]
file=/home/supervisor/supervisor.sock   ; supervisorctl使用的 socket文件的路径
;chmod=0700                 ; 默认的socket文件权限0700
;chown=nobody:nogroup       ; socket文件的拥有者

[inet_http_server]         ; 提供web管理后台管理相关配置
port=0.0.0.0:9001          ; web管理后台运行的ip地址及端口,绑定外网需考虑安全性 
;username=root             ; web管理后台登录用户名密码
;password=root

[supervisord]
logfile=/var/log/supervisord.log ; 日志文件,默认在$CWD/supervisord.log
logfile_maxbytes=50MB        ; 日志限制大小,超过会生成新文件,0表示不限制
logfile_backups=10           ; 日志备份数量默认10,0表示不备份
loglevel=info                ; 日志级别
pidfile=/home/supervisor/supervisord.pid ; supervisord pidfile; default supervisord.pid              ; pid文件
nodaemon=false               ; 是否在前台启动,默认后台启动false
minfds=1024                  ; 可以打开文件描述符最小值
minprocs=200                 ; 可以打开的进程最小值

[supervisorctl]
serverurl=unix:///home/supervisor/supervisor.sock ; 通过socket连接supervisord,路径与unix_http_server->file配置的一致

[include]
files = supervisor.d/*.ini;指定了在当前目录supervisor.d文件夹下配置多个配置文件,跟nginx的 vhost/*一个意思

我们在/etc/supervisord.d/ 下定义一个goboot.ini文件

[program:goboot]                    ;这里的xxx是指的项目名字
directory = /mnt/hgfs/project/demo  ;程序所在目录
command =  go run main.go           ;程序启动命令
autostart=true                      ;是否跟随supervisord的启动而启动
autorestart=true                    ;程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true                    ;进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true                    ;向进程组发送kill信号,包括子进程
stdout_logfile=/home/wwwlogs/go.log ;该程序日志输出文件,目录需要手动创建
stdout_logfile_maxbytes = 50MB      ;日志大小
stdout_logfile_backups  = 100       ;备份数

定好后之后 我们开始启动,一下是启动命令 如果后面不跟着具体的program则是操作全局

  supervisorctl start all
  supervisorctl stop all
  supervisorctl restart all

如果想只操作具体的program 怎可以使用以下命令,我的goboot为例

  supervisorctl start goboot
  supervisorctl stop goboot
  supervisorctl restart goboot

先查看supervisord服务是否已经启动

[root@localhost wwwlogs]# service supervisord status
Redirecting to /bin/systemctl status supervisord.service
● supervisord.service - Process Monitoring and Control Daemon
   Loaded: loaded (/usr/lib/systemd/system/supervisord.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2021-03-21 15:53:23 CST; 5s ago
  Process: 3104 ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf (code=exited, status=0/SUCCESS)
 Main PID: 3107 (supervisord)
   CGroup: /system.slice/supervisord.service
           └─3107 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf

3月 21 15:53:23 localhost.localdomain systemd[1]: Starting Process Monitoring and Control Daemon...
3月 21 15:53:23 localhost.localdomain systemd[1]: Started Process Monitoring and Control Daemon.

好了 现在可以启动我们的web项目了

[root@localhost supervisord.d]# supervisord -c /etc/supervisord.conf
Unlinking stale socket /var/run/supervisor/supervisor.sock
[root@localhost supervisord.d]# supervisorctl
goboot                           RUNNING   pid 3328, uptime 0:00:06

通过supervisorctl我们可以看到我们的项目启动在3328这个进程号上 我们访问一下


image.png

是可以正确访问的
查看下3328这个进程的情况


image.png

完成

更多有关于supervisor 请移步至http://www.supervisord.org/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容