当前位置: 首页 > 工具软件 > Supervisord > 使用案例 >

linux服务与进程管理sup,linux下进程管理工具-supervisord

逄念
2023-12-01

一 简介

supervisord是linux下的一个优秀的进程管理工具,通过supervisord可以方便管理和应用linux系统下服务进程过多的问题,其支持服务异常退出自动重启,通过浏览器管理控制相关进程服务的运行状况,进程异常服务通知等等。

二 安装

2.1 通过分发包安装

[root@node1 setuptools-36.7.0]# yum info supervisor

[root@node1 setuptools-36.7.0]# yum -y install supervisor

2.2 通过PIP安装

pip install supervisor

2.3 创建配置文件

supervisor安装完成后打印样本配置文件

[root@node1 ~]# echo_supervisord_conf

生成配置文件

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

三 运行supervisord

3.1 查看superviosrd命令路径

[root@node1 ~]# which supervisord

/usr/bin/supervisord

3.2 运行supervisord

添加程序,将cat程序添加到superviosrd进程启动如下配置

vim /etc/supervisord.conf

[program:foo]

command = / bin / cat

其他可参考[program:x]配置段配置

supervisord运行时默认执行守护进程,跟-n选项是superviosrd在前台执行,这样对调试有好处。

-c选项可以指定搜索superviosrd配置文件,如果没有改选项则supervisord将在默认位置搜索其配置文件。这对安全有一定的作用,如果没有-c选项则用户已超级管理员身份启动时会发出警告。

supervisord命令行选项

-c FILE, --configuration=FILE

supervisord配置文件的路径。

-n, --nodaemon 在前台运行supervisord。

-h, --help 显示supervisord命令帮助。

-u USER, --user=USER

UNIX用户名或数字用户标识。如果supervisord以root用户身份启动,请在启动过程中尽快将setuid设置为该用户。

-m OCTAL, --umask=OCTAL

八进制数(例如022)代表supervisord在启动后应使用的umask。

-d PATH, --directory=PATH

当supervisord作为守护进程运行时,请在守护进程之前切换到此目录。

-l FILE, --logfile=FILE

用作supervisord活动日志的文件名路径。

-y BYTES, --logfile_maxbytes=BYTES

发生旋转之前的supervisord活动日志文件的最大大小。该值是后缀相乘的,例如“1”是一个字节,“1MB”是1兆字节,“1GB”是1千兆字节。

-y NUM, --logfile_backups=NUM

要保留的supervisord活动日志的备份副本数。每个日志文件的大小都是logfile_maxbytes。

-e LEVEL, --loglevel=LEVEL

主管应写入活动日志的日志记录级别。有效的级别是跟踪,调试,信息,警告, 错误和关键。

-j FILE, --pidfile=FILE

supervisord应该写入其pid文件的文件名。

-i STRING, --identifier=STRING

各种客户端UI为这个监督者实例公开的任意字符串标识符。

-q PATH, --childlogdir=PATH

目录的路径(它必须已经存在),其中主管将写入其AUTO- MODE子进程日志。

-k, --nocleanup

防止supervisord在启动时执行清理(删除旧的AUTO进程日志文件)。

-a NUM, --minfds=NUM

在supervisord进程成功启动之前必须可用的文件描述符的最小数量。

-t, --strip_ansi

从所有子日志进程中去除ANSI转义序列。

-v, --version 将supervisord版本号输出到标准输出并退出。

--profile_options=LIST

用于分析的逗号分隔选项列表。导致 supervisord在分析器下运行,并根据选项输出结果,该选项是以逗号分隔的列表:累积,调用,调用者。如累计,来电者。

--minprocs=NUM 在supervisord进程成功启动之前必须可用的OS进程槽的最小数量。

3.3 运行supervisorctl

要启动supervisorctl,请运行$ BINDIR / supervisorctl。将显示一个shell,使您可以控制当前由supervisord管理的进程。在提示符处输入“help”以获取有关支持的命令的信息。

如果supervisorctl在交互模式调用针对 supervisord需要验证,你将被要求提供身份验证凭据。

superviosrctl命令行选项

-c, --configuration

配置文件路径(默认是/etc/supervisord.conf)

-h, --help 打印使用情况消息并退出

-i, --interactive

执行命令后启动交互式shell

-s, --serverurl URL

supervisord服务器正在监听的URL(默认“ http:// localhost:9001 ”)。

-u, --username 用于与服务器验证的用户名

-p, --password 用于与服务器进行身份验证的密码

-r, --history-file

保持readline历史记录(如果readline可用)

[root@node1 ~]# supervisorctl

foo RUNNING pid 2342, uptime 0:16:35

3.4 信号处理

该supervisord程序可以发送它的运行信号使得它执行特定操作。

可以将这些信号中的任何一个发送到单个supervisord进程标识,该进程ID可以在配置文件/etc/supervisord.conf中[supervisord]配置段中pidfile参数表示文件中找到

3.5 运行时安全

为supervisord允许在其配置文件中的任意路径规范写入数据。允许任意路径选择可能会造成符号链接***的漏洞。在配置中指定路径时要小心。确保supervisord 配置文件不能被非特权用户读取或写入,并且由超级用户包安装的所有文件都具有“健全”的文件权限保护设置。此外,请确保您的PYTHONPATH是健全的,并且所有Python标准库文件都具有足够的文件权限保护。

3.5 在启动自动运行supervisord

创建开机启动脚本文件/etc/init.d/superviosrd

[root@node1 ~]# vim /etc/init.d/supervisord

[root@node1 ~]# chmod u+x supervisord

[root@node1 ~]# chkconfig supervisord on (rehl6.5开机启动设置)

[root@node1 ~]# systemctl enable supervisord (Centos 7.2开机启动设置)

[root@node1 ~]# systemctl disable supervisord (关闭开机启动)

开启supervisord服务

[root@node1 ~]# systemctl start supervisord

重启服务

[root@node1 ~]# systemctl restart supervisord

停止服务

[root@node1 ~]# systemctl stop supervisord

运行supervisorctl

启动supervisorctl,执行supervisorctl,将显示一个shell,使您可以控制supervisord管理的进程,在提示符输入help以获取相关支出的命令信息

如下:

[root@node1 ~]# supervisorctl

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

3.6 启动web访问功能

修改相关配置文件开启

[inet_http_server] ; inet (TCP) server disabled by default

port = :9999 ; (ip_address:port specifier,:port for all iface)

浏览器访问方式如下:

http://IP:9999

四 supervisord配置文件详解

参考链接:http://www.supervisord.org/configuration.html

4.1 superviosrd配置文件

Supervisor配置文件通常命名为 supervisord.conf。它由supervisord 和supervisorctl使用。如果任一应用程序在没有-c选项的情况下启动(用于显式指示配置文件名的选项),应用程序将按照指定的顺序在以下位置查找名为supervisord.conf的文件。它将使用它找到的第一个文件。

生成配置文件[root@node1 ~]# echo_supervisord_conf > /etc/supervisord.conf

4.2 配置文件格式

supervisord.conf是一个Windows-INI风格的(Python ConfigParser)文件。它包含部分(每个部分都用 [header]表示)和部分内的键/值对。下面介绍这些部分及其允许值。

4.3 环境变量

4.4 unix_http_server配置段

[unix_http_server]该配置段对于unix与套接字监听http服务器的配置参数应插入。如果配置文件没有[unix_http_server]部分,则unix域套接字http服务器将不会启动

允许配置如下:

[unix_http_server]

file=/tmp/supervisor.sock ; (the path to the socket file)

;chmod=0700 ; socket file mode (default 0700)

;chown=nobody:nogroup ; socket file uid:gid owner

;username=user ; (default is no username (open server))

;password=123 ; (default is no password (open server))

注:

chmod 启动时将unix套接字的unix权威模式位更改为此值。

默认700

chown 将套接字文件的用户和组更改为此值,可能是unix用户名或user:group

默认:使用启动supervisord的用户的用户名和组

username 此http服务器验证所需要的用户名

默认:不需要用户名

password 此http服务器验证所需要的密码,可以使名为密码或者以{SHA}为前缀的sha-1哈希。

默认:不需要密码

注意:散列的密码必须是十六进制格式

4.5 inet_http_server配置段

;[inet_http_server] ; inet (TCP) server disabled by default

;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)

;username=user ; (default is no username (open server))

;password=123 ; (default is no password (open server))

4.5 supervisord配置段

[supervisord]

logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)

logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)

logfile_backups=10 ; (num of main logfile rotation backups;default 10)

loglevel=info ; (log level;default info; others: debug,warn,trace)

pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)

nodaemon=false ; (start in foreground if true;default false)

minfds=1024 ; (min. avail startup file descriptors;default 1024)

minprocs=200 ; (min. avail process descriptors;default 200)

;umask=022 ; (process file creation umask;default 022)

;user=chrism ; (default is current user, required if root)

;identifier=supervisor ; (supervisord identifier, default is 'supervisor')

;directory=/tmp ; (default is not to cd during start)

;nocleanup=true ; (don't clean up tempfiles at start;default false)

;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP)

;environment=KEY="value" ; (key value pairs to add to environment)

;strip_ansi=false ; (strip ansi escape codes in logs; def. false)

supervisord的全局设置[supervisord]

4.6 supervisorctl配置段

[supervisorctl]

serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket

;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket

;username=chris ; should be same as http_username if set

;password=123 ; should be same as http_password if set

;prompt=mysupervisor ; cmd line prompt (default "supervisor")

;history_file=~/.sc_history ; use readline history if available

4.7 program:x配置段

配置文件必须包含一个或过个程序部,以便supervisord知道应该启动和控制哪些程序,标题值是复合值,他是program,后接冒号,然后是程序名[program:foo]的标题是名为foo的程序。该名称用户控制作为配置结果长江的进程的客户端应用程序中。创建没有名称的program段是错误的。该名称不能包含冒号字符或括号字符。该名称的值用作指定的%(program_name)s字符串表达式扩展的值

注意:一个[program:x]部分实际上代表了一个“同质过程组”到supervisord,组的成员有配置中的numpros和process_name参数的组合来定义。默认情况下,如果numproces和process_name保持其默认值不变。有[program:x]表示的组将命名为x,并且将有一个名为x的进程。者提供了一个向后兼容旧版本的超级管理员版本。它不会讲程序部分视为同类进程组定义。

command=/usr/bin/cat

作用:改程序启动时将运行的命令。该命令可以使绝对值也可以为相对值。如果是相对的则会自动搜索supervisor的环境$PATH以查找可执行文件。程序可以接收的参数,例如

4.7 [inet_http_server] 配置段

[inet_http_server]; inet (TCP) server disabled by default

port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)

;username=user ; (default is no username (open server))

;password=123 ; (default is no password (open server))

port=127.0.0.1:8080

4.8 [eventlistener:theeventlistenername]实现supervisord对异常进程进行报警

详细的Event特性请参考:http://supervisord.org/events.html

五 事件

5.1 事件监听和通知

Supervisor为称为“事件监听器”的特殊编写程序(它作为子进程运行)提供了一种订阅“事件通知”的方法。事件通知、订阅系统的目的是提供一种机制,用于满足某些条件时运行任意代码(例如:发送邮件,发送http请求)。这种情况通常与子进程状态有关。可以根据superviosr重新启动时通过电子邮件通知到某人。

事件通知协议是基于子进程’stdin’和’stdout’的通信。Supervisor将特殊格式的输入发送到事件侦听器进程的stdin,并期望来自事件侦听器stdout的特殊格式的输出,从而形成请求 - 响应周期。supervisord和监听器的实现者之间达成一致的协议允许监听器处理事件通知

5.2 配置事件监听器

supervisord事件监听器是在配置文件中[eventlistener:x]部分指定,除了Supervisor不遵守事件侦听器进程的“捕获模式”输出外(即事件侦听器不能是 PROCESS_COMMUNICATIONS_EVENT事件生成器),其与与supervisor [program:x] 部分几乎完全相同。因此在eventlistener的配置段中指定stdout_capture_maxbytes或 stderr_capture_maxbytes是错误的。对可放置到配置文件中的eventlistener部分数量没有任何人为约束。

当定义[eventlistener:x]部分时,它实际上定义了一个“池”,其中池中的事件侦听器的数量由部分中的numprocs值决定。

5.3 事件通知协议

侦听器在其stdin上发送一个”标题”行,该行组成是由一个空格彼此分开的一组冒号分隔的标记并以\n终止。

事件类型:

1 PROCESS_COMMUNICATION_STDOUT事件通知示例

processname:foo groupname:bar pid:123

这是标记之间发送的数据

事件监听状态

Name 描述

ACKNOWLEDGED 事件监听器已确认(接受或拒绝)事件发送。

READY 事件通知可以发送到此事件侦听器

BUSY 事件通知可能不会发送到此事件侦听器。

5.4 配置supervisord监听脚本

参考链接:

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

附录

附录一 supervisord开机启动脚本

[root@node1 ~]# vim /etc/init.d/supervisord

. /etc/rc.d/init.d/functions

prog="supervisord"

prefix="/usr/"

exec_prefix="${prefix}"

prog_bin="${exec_prefix}/bin/supervisord"

PIDFILE="/var/run/$prog.pid"

start()

{

echo -n $"Starting $prog: "

daemon $prog_bin --pidfile $PIDFILE

[ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog startup"

echo

}

stop()

{

echo -n $"Shutting down $prog: "

[ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"

echo

}

case "$1" in

start)

start

;;

stop)

stop

;;

status)

status $prog

;;

restart)

$0 stop

$0 start

;;

*)

echo "Usage: $0 {start|stop|restart|status}"

;;

esac

附录二 supervisord操作指南

基本语法

附录三 supervisorctl操作指南

基本语法

Error

error1

Error: %(process_num) must be present within process_name when numprocs > 1

如果需要生成多个进程则需要在processname名称中添加%(process_num)s标识.

应用

应用1 配置superisord管理httpd守护进程

[program:web_apache]

command=/usr/sbin/httpd -D FOREGROUND

autostart=true

autorestart=true

startsecs=3

user=root

应用2监控ningx服务进程

[program:web_nginx]

command=/usr/bin/nginx

autostart=true

autorestart=true

startsecs=3

user=root

process_name=%(programname)s%(process_num)s

numprocs=4

查看监控详情

在nginx配置主配置文件中加入以下内容,禁止nginx以守护进程运行

[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf

daemon off

测试效果:

启动supervisord守护进程通过web监控页面浏览

应用3 supervisord实现进程异常告警

参考链接: http://talk.withme.me/?p=318

利用Supervisord进行进程监控和报警主要的利用Supervisord的Event特性,编写一个listener,监控进程状态的改变,然后执行指定的代码。

应用4 supervisord实现对php-fpm的控制

修改supervisord的相关配置文件/etc/supervisord.conf

[include]

files=/etc/supervisord.d/*.ini

配置文件/etc/supervisord.d/

/etc/supervisord.d/ php_fpm.ini

将如下内容添加到相关配置文件中

[program:db_php-fpm]

command=/usr/sbin/php-fpm

autostart=true

autorestart=true

startsecs=3

user=root

process_name=%(programname)s%(process_num)s

应用5 supervisord实现对mysql进程服务的控制

同上将以下内容追加到配置文件中

[root@localhost fonts]#vim /etc/supervisord.d/mysqld.server.ini

;mysql服务配置端

[program:db_mysqld]

command=/usr/sbin/mysqld

autostart=true

autorestart=true

startsecs=3

user=root

process_name=%(programname)s%(process_num)s

 类似资料: