文档章节

进程管理工具: supervisor

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:24
字数 2224
阅读 1
收藏 0
点赞 0
评论 0

Linux 的后台进程运行的方式有好几种,例如:nohup,screen等,具体方式可以查看这篇文章。但是,如果我们需要对一个服务程序进行可靠地在后台运行,我们就需要把它做成 daemon,最好还能监控进程状态,在意外结束时可以自动重启进程。

Supervisor 就是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。但是只能运行在 Unix-Like 的系统上,不能运行在 Windows 上。Supervisor 官方版目前只支持 Python 2.4 以上版本,但是还无法运行在 Python 3 上。

除此之外,supervisor 还能很友好的管理程序在命令行上输出的日志,可以将日志重定向到自定义的日志文件中,还能按文件大小对日志进行分割。

supervisor 是一个 C/S 系统,目前很多生产环境下的服务器都在使用 supervisor。

supervisor 的服务端称为 supervisord,主要负责在启动自身时启动管理的子进程,响应客户端的命令,重启崩溃或退出的子进程,记录子进程 stdout 和 stderr 输出,生成和处理子进程生命周期中的时间。可以在一个配置文件中配置相关参数,包括 supervisord 自身的状态,其管理的各个子进程的相关属性。配置文件一般位于 /etc/supervisord.conf 。

supervisor 的客户端称为 supervisorctl,它提供了一个类 shell 的接口(即命令行)来使用 supervisord 服务端提供的功能。通过 supervisorctl,用户可以连接到 supervisord 服务器进程,获得服务器进程控制的子进程的状态,启动和停止子进程,获得正在运行的进程列表。客户端通过 Unix 域套接字或者 TCP 套接字域服务端进行通信,服务器端具有身份凭证认证机制,可以有效提升安全性。当客户端和服务器位于同一台机器上时,客户端域服务器公用同一个配置文件 /etc/supervisord.conf,通过不同标签来区分两者的配置。

安装

supervisor 的安装很简单,我用的 Ubuntu 系统,直接使用如下命令就可以安装:

apt-get install supervisor
或者
pip install supervisor

配置文件说明

想要了解怎么配置需要管理的进程,只需要打开 supervisord.conf 就可以了,里面有很详细额注释消息。

接下来,我们来打开配置文件。

vi  /etc/supervisor/supervisord.conf

默认的配置文件是下面这样的.

; supervisor config file

[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)


; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.

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

默认情况下,进程的日志文件达到 50 MB时,将进行分割,最多保留 10 个文件,当然这些配置也可以对每个进程单独配置。

进程的配置样例

我们写一个简单的例子,命名为 myapp.conf,文件的位置是 /etc/supervisor/conf.d/myapp.conf,如下:

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:your_program_name] 
command=python server.py --port=9000
;numprocs=1                 ; 默认为1
;process_name=%(program_name)s   ; 默认为 %(program_name)s,即 [program:x] 中的 x
directory=/home/python/tornado_server ; 执行 command 之前,先切换到工作目录
user=oxygen                 ; 使用 oxygen 用户来启动该进程
; 程序崩溃时自动重启,重启次数是有限制的,默认为3次
autorestart=true            
startretries=3     ;启动失败自动重试次数,默认是3
redirect_stderr=true        ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

当我们添加好配置文件之后,我们可以更新新的配置到 supervisord,如下:

supervisorctl update

我们顺便说一下 supervisor 的一些命令。

重新启动配置中的所有程序:

supervisorctl reload

启动某个进程(program_name = 你配置中写的程序名称)

supervisorctl start program_name

查看正在守候的进程

supervisorctl

停止某一进程(program_name = 你配置中写的程序名称)

supervisorctl stop program_name

重启某一进程(program_name = 你配置中写的程序名称)

supervisorctl restart program_name

停止全部进程

supervisorctl stop all

注意:用 stop 停止掉的进程,用 reload 或者 update 都不会自动重启。

以上这些命令,我们也可以通过终端来实现,输入命令 supervisorctl,就可以输入以下命令了:

  • help:查看帮助
  • status:查看程序状态
  • stop program_name:关闭指定的程序
  • start program_name:启动指定的程序
  • restart program_name:重启指定的程序
  • tail -f program_name:查看该程序的日志
  • update:重启配置文件修改过的程序

设置日志级别

loglevel 指定了日志的级别,用 Python 的 print 语句输出的日志是不会被记录到日志文件中的,需要搭配 Python 的 logging 模块来输出有指定级别的日志。

多个进程

按照官方文档的定义,一个 [program:x] 实际上是表示一组相同特征或同类的进程组,也就是说一个 [program:x] 可以启动多个进程。这组进程的成员是通过 numprocs 和 process_name 这两个参数来确定的,这句话什么意思呢,我们来看这个例子。

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:foo] 
; 可以在 command 这里用 python 表达式传递不同的参数给每个进程
command=python server.py --port=90%(process_num)02d
directory=/home/python/tornado_server ; 执行 command 之前,先切换到工作目录
; 若 numprocs 不为1,process_name 的表达式中一定要包含 process_num 来区分不同的进程
numprocs=2                   
process_name=%(program_name)s_%(process_num)02d; 
user=oxygen                 ; 使用 oxygen 用户来启动该进程
autorestart=true            ; 程序崩溃时自动重启
redirect_stderr=true        ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

上面这个例子会启动两个进程,process_name 分别为 foo:foo_01 和 foo:foo_02。通过这样一种方式,就可以用一个 [program:x] 配置项,来启动一组非常类似的进程。

再介绍两个配置项 stopasgroup 和 killasgroup

; 默认为 false,如果设置为 true,当进程收到 stop 信号时,会自动将该信号发给该进程的子进程。如果这个配置项为 true,那么也隐含 killasgroup 为 true。例如在 Debug 模式使用 Flask 时,Flask 不会将接收到的 stop 信号也传递给它的子进程,因此就需要设置这个配置项。
stopasgroup=false             ; send stop signal to the UNIX process 
 
; 默认为 false,如果设置为 true,当进程收到 kill 信号时,会自动将该信号发给该进程的子进程。如果这个程序使用了 python 的 multiprocessing 时,就能自动停止它的子线程。
killasgroup=false             ; SIGKILL the UNIX process group (def false)

更详细的配置例子,可以参考如下:

;[program:theprogramname]
;command=/bin/cat              ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=999                  ; the relative start priority (default 999)
;autostart=true                ; start at supervisord start (default: true)
;autorestart=unexpected        ; whether/when to restart (default: unexpected)
;startsecs=1                   ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3)
;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
;killasgroup=false             ; SIGKILL the UNIX process group (def false)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;environment=A="1",B="2"       ; process environment additions (def no adds)
;serverurl=AUTO                ; override serverurl computation (childutils)

启动 supervisord

执行 supervisord 命令,将会启动 supervisord 进程,同时我们在配置文件中设置的进程也会相应启动。

# 使用默认的配置文件 /etc/supervisord.conf
supervisord
# 明确指定配置文件
supervisord -c /etc/supervisord.conf
# 使用 user 用户启动 supervisord
supervisord -u user

参考:
廖雪峰的官方网站
jobbole
cnblogs

本文转载自:http://www.jianshu.com/p/e256582fb41f

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2634
码字总数 82983
作品 0
程序员
ubuntu 进程管理工具 supervisorctl

Supervisor是基于 Python 的进程管理工具,可以帮助我们更简单的启动、重启和停止服务器上的后台进程,是 Linux 服务器管理的效率工具。 什么情况下我们需要进程管理呢?就是执行一些需要以守...

bengozhong
06/30
0
0
CentOS7下Supervisor安装与配置(Linux/Unix进程管理工具)

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多...

yzy121403725
06/27
0
0
Supervisor安装与配置

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多...

AltBoy
06/26
0
0
使用Supervisor管理Redis进程

使用Supervisor管理Redis进程 环境:MAC OS Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。除...

秋风醉了
2016/04/14
372
0
Supervisor 管理进程,Cloud Insight 监控进程,完美!

[Supervisor][1] 是由 [Python][2] 语言编写、基于 linux 操作系统的一款服务器管理工具,用于监控服务器的运行,发现问题能立即自动预警及自动重启等。 [Cloud Insight][3] 是一款次世代监控...

OneAPM蓝海讯通
2016/05/19
38
0
Supervisor 来管理进程

一、使用 Supervisor 来管理进程 Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的...

柴鑫旺
2017/09/01
0
0
supervisor安装和配置指南

supervisor:是用python写的一个进程管理工具,用来启动,重启,关闭进程。 注意:Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程。否则提示Exited too quickly (p...

高运维之路
05/03
0
0
进程管理工具Supervisor的安装及使用

Supervisor 是基于 Python ,运行于 Unix-Like 系统的进程管理工具。 Supervisor 为需要以守护进程方式执行的程序提供了不错的管理方式,也能很友好的管理程序在命令行上输出的日志,将日志重...

唯慕清风
2016/11/13
15
0
centos上安装supervisor来管理dotnetcore等应用程序

supervisor 介绍:   这是一款用python编写的进程管理工具,可以守护他管理的所有进程,防止异常退出,以及提供一个可视化的web界面来手动管理,打开关闭重启各种应用,界面如下: 关于在c...

yzy121403725
05/03
0
0
Linux(CentOS and Ubuntu)安装Shadowsocks服务端server教程

安装 Shadowsocks Ubuntu CentOS 配置 创建配置文件: 内容如下: 如果需要分配多个帐号,配置如下: Shadowsocks 官方使用说明: 前去阅读 启动 Shadowsocks 前台启动 后台运行 安装 Superv...

JungleKing
2017/10/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一款成功的全球服游戏该如何进行架构选型与设计?

全球服游戏如今正在成为出海游戏的主要考虑模式,跨国对战、全球通服打破国界的限制,将不同地区不同语言的玩家放在一起合作/竞技,成功吸引了大量玩家的关注,并逐渐成为主流的游戏玩法。 ...

UCloudTech
2分钟前
0
0
StringUtils类中isEmpty与isBlank的区别

org.apache.commons.lang.StringUtils类提供了String的常用操作,最为常用的判空有如下两种isEmpty(String str)和isBlank(String str)。 StringUtils.isEmpty(String str) 判断某字符串是否为...

说回答
15分钟前
0
0
react native使用redux快速上手

看例图 要求点击组件一中的按钮,改版组件二的背景色。 利用state和props和容易实现。 //app.jsimport React, {Component} from 'react';import {StyleSheet, Button, View, Text} from ...

燕归南
17分钟前
0
0
页面输出JSON格式数据

package com.sysware.utils;import java.io.IOException;import javax.servlet.ServletResponse;import org.apache.log4j.Logger;import com.sysware.SyswareConstant;pub......

AK灬
38分钟前
0
0
springCloud-2.搭建Eureka Client的使用

1.使用IDEA,Spring Initializr创建 2.填写项目资料 3.选择spring boot版本,插件选择Cloud Discovery→Eureka Discovery 4.选择保存地址 5.修改application.yml eureka: client: s...

贺小康
41分钟前
0
0
CenOS 6.5 RPM 安装 elasticsearch 6.3.1

下载 wget --no-check-certificate https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.rpm...

阿白
44分钟前
0
0
1.4 创建虚拟机&1.5 安装CentOS7&1.6 配置ip(上)&1.7 配置ip(下)

1.4 创建虚拟机 知识点 虚拟机网络链接模式 桥连 直接将虚拟网卡桥接到一个物理网卡上面。需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主...

小丑鱼00
50分钟前
0
0
TrustAsia(亚洲诚信)助力看雪2018安全开发者峰会

2018年7月21日,看雪2018安全开发者峰会在北京国家会议中心圆满落下帷幕。拥有18年悠久历史的老牌安全技术社区——看雪学院联手国内最大开发者社区CSDN,汇聚业内顶尖的安全开发者和技术专家...

亚洲诚信
51分钟前
0
0
Spring注解介绍

@Resource、@AutoWired、@Qualifier 都用来注入对象。其中@Resource可以以 name 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。 但它们有一些细微区...

lqlm
今天
0
0
32位汇编在64位Ubuntu上的汇编和连接

本教程使用的操作系统是Ubuntu Linux 18.04 LTS版本,汇编器是GNU AS(简称as),连接器是GNU LD(简称ld)。 以下是一段用于检测CPU品牌的汇编小程序(cpuid2.s): .section .dataoutput...

ryanliue
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部