大家好,今天小编来为大家解答以下的问题,关于高效Linux进程管理:Supervisor应用指南,这个很多人还不知道,现在让我们一起来看看吧!
Supervisor安装与配置(linux/unix进程管理工具) Supervisor(Supervisor: A Process Control System)是一个用Python开发的客户端/服务器服务。它是Linux/Unix系统下的进程管理工具,不支持Windows系统。它可以轻松地监视、启动、停止和重新启动一个或多个进程。对于Supervisor管理的进程,当一个进程被意外杀死时,Supervisor在监听到该进程的死亡后会自动重新启动该进程。非常方便的实现进程的自动恢复功能。您不再需要自己编写shell 脚本来控制它。
由于Supervisor是用Python开发的,安装前请检查系统是否安装了Python 2.4及以上版本。下面介绍CentOS7.6和Python2.7.5环境下Supervisor的安装和配置步骤。
1. 实验环境
1. 系统
root@localhost:/data# cat /etc/redhat-release
CentOS Linux 版本7.7.1908(核心)2,Python 版本
root@localhost:/data# python -V
Python 2.7.5 如果Python版本低于2.6,请升级。下面贴出安装python3.6.8的安装示例。
百胜安装zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y libffi-devel
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
tar xf Python-3.6.8.tar.xz
cdPython-3.6.8
./configure --prefix=/usr/local/python368
进行安装
echo "导出PATH=/usr/local/python368/bin:$PATH" /etc/profile
源/etc/profile
python3 -V 2.安装Supervisor
安装Supervisor 的方法有很多种。下面介绍三者。我这里用的是第三个。
1.easy_install安装主管
安装Python包管理工具(easy_install) easy_install是setuptools包中包含的命令。使用easy_install实际上是调用setuptools来完成安装模块的工作,所以只需安装setuptools :
wget https://pypi.io/packages/source/s/setuptools/setuptools-33.1.1.zip
解压setuptools-33.1.1.zip
cd setuptools-33.1.1
python setup.py 安装
easy_installsupervisor2,pip安装supervisor
使用pip安装,前提是保证pip版本大于2.6
pip install Supervisor3、yum epel-release 安装Supervisor
yum install -y epel-release yum install -ysupervisor 3.supervisoro命令
Supervisor安装完成后,会生成三个执行程序:supervisord、supervisorctl、echo_supervisord_conf:
•supervisord:用于管理supervisor服务本身
•supervisorctl:用于管理我们需要委托给supervisoro工具的服务
•echo_supervisord_conf:用于生成supervisor配置文件
•Supervisor的守护进程服务(用于接收进程管理命令)
•客户端(用于与守护进程通信并发送管理进程的指令)
root@localhost:/data# 哪个主管
/bin/supervisord
root@localhost:/data#whichsupervisorctl
/bin/supervisorctl
root@localhost:/data# 其中echo_supervisord_conf
/bin/echo_supervisord_conf 4. 配置Supervisor
1. 通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件。
如果使用yum安装,则省略此步骤,直接进入修改配置文件步骤。
mkdir /etc/supervisord.d
echo_supervisord_conf /etc/supervisord.conf2、修改配置文件
Supervisor配置文件中的内容较多,但很多内容无需修改即可使用。我这里只修改了以下两项。
#修改socket文件的模式,默认为0700
sed -i "s/;chmod=0700/chmod=0766/g" /etc/supervisord.conf
#在配置文件末尾添加以下两行以包含/etc/supervisord目录
sed -i "$a [包括]
files=/etc/supervisord.d/*.conf" /etc/supervisord.conf 5、写入需要Supervisor管理的进程
1. SMProxy由Supervisor管理
描述:
SMProxy是Swoole基于MySQL协议开发的MySQL数据库连接池。
它的原理是将数据库连接作为对象存储在内存中。当用户需要访问数据库时,会第一次建立连接。稍后,不再建立新的连接,而是从连接池中取出已建立的空闲连接对象。使用完毕后,用户并不关闭连接,而是将连接放回到连接池中,以供下次请求使用。连接的建立和断开由连接池本身管理。同时还可以通过设置连接的参数来控制连接池的初始连接数、连接的上下限、每个连接的最大使用次数、最大空闲时间等水池。它还可以通过自己的管理机制来监控数据库连接的数量、使用情况等。如果超过最大连接数,协程将被挂起,协程将被恢复,直到关闭连接才能继续运行。
特性
支持读写分离和数据库连接池,可以有效解决PHP带来的数据库连接瓶颈。支持SQL92标准,采用协程调度,支持多数据库连接、多数据库、多用户。灵活匹配,符合MySQL原生协议。跨语言、跨平台的通用中间件代理,支持MySQL。交易支持HandshakeV10。协议版本完美兼容MySQL5.5-8.0。它与所有主要框架兼容并无缝提高性能。官方网站:SMProxy
如果我们希望我们的SMProxy由Supervisor管理,我们需要在/etc/supervisord.d目录中编写一个配置文件。 SMProxy示例如下:
root@localhost:/data# cat /etc/supervisord.d/smproxy.conf
[程序:smproxy]
目录=/data/SMProxy
命令=/usr/local/php/bin/php /data/SMProxy/SMProxy start --console
自动启动=真
启动秒=3
自动重启=true
开始重试=3
用户=root
优先级=1
停止信号=INT
重定向_stderr=true
stdout_logfile_maxbytes=200MB
stdout_logfile_backups=100
stdout_logfile=/data/SMProxy/logs/catalina.out
stopasgroup=假
Killasgroup=false 说明:
#程序唯一名称
[程序:smproxy]
#程序路径
目录=/data/SMProxy
#运行程序的命令
命令=/usr/local/php/bin/php /data/SMProxy/SMProxy start --console
#supervisord启动后tomcat是否也启动?
自动启动=真
#如果启动3秒后没有异常退出,则说明进程正常启动。默认值为1 秒。
启动秒=3
#程序退出后自动重新启动。可选值:[意外、真、假]。默认是unexpected,即进程被意外杀死后会重新启动。这意味着,如果进程没有被supervisord关闭,就会被认为是非正常关闭,supervisord会重新启动该进程,并且只能使用supervisorctl来执行关闭、启动、重启等操作。
自动重启=true
#启动失败自动重试次数,默认3次
开始重试=3
#使用哪个用户来启动进程,默认是root
用户=root
#进程启动优先级,默认为999。如果Supervisord需要管理多个进程,则优先启动较小的值。
优先级=999
停止信号=INT
#将stderr重定向到stdout标准输出,默认false
重定向_stderr=true
#stdout 标准输出日志文件大小。当日志文件大小达到200M时,就会被截断。剪切日志文件将被标记为catalina.out1、catalina.out2、catalina.out3.默认为50MB。
stdout_logfile_maxbytes=200MB
#stdout标准输出日志文件备份数量,保存100 200MB日志文件,如果数量超过100,旧的会被删除,默认10个,保存10个
stdout_logfile_backups=100
#标准日志输出位置。如果输出位置不存在,则启动失败。
stdout_logfile=/data/SMProxy/logs/catalina.out
#默认为假。当进程被杀死时,是否向该进程组(包括子进程)发送停止信号
stopasgroup=假
#默认为false,向进程组发送kill信号,包括子进程
Killasgroup=false 使用supervisord管理启动进程后,当你使用/usr/local/php/bin/php /data/SMProxy/SMProxy stop 或kill $PID时,supervisord会认为是意外关闭,会自动关闭该进程再次处理。除非使用supervisord 命令关闭,否则将被拉起。
#启动supervisord进程。我们在配置文件中设置autostart=true参数。当supervisord启动时,smproxy也会启动。
root@localhost:/data#supervisord -c /etc/supervisord.conf
root@localhost:/data#
程序管理
supervisorctl status smproxy #smproxy 状态
Supervisorctl stop smproxy #停止smproxy
Supervisorctl start smproxy #启动smproxy
Supervisorctl restart smproxy #重启smproxy
Supervisorctl 重新加载smproxy
程序管理例子
root@localhost:/data#supervisorctl status smproxy
smproxy 运行pid 7098,正常运行时间0:41:20
root@localhost:/data#supervisorctl stop smproxy
smproxy: 已停止
root@localhost:/data#supervisorctl 启动smproxy
smproxy: 已启动
root@localhost:/data# /data/SMProxy/SMProxy 状态
SMProxy[v1.3.1] - Linux localhost.localdomain 3.10.0-957.12.2.el7.x86_64 #1 SMP 5 月14 日星期二21:24:32 UTC 2019 x86_64
主机: 0.0.0.0,端口: 3366,PHPVerison: 7.3.11
Swoole版本: 4.4.17,WorkerNum: 2
进程: 总共24 个,22 个休眠,2 个查询
+-----+------+------------------+---------+-------- - -+------+------------+---------------------------- ---- +----------------+--------------------+----- --- -------+----------------+
|身份证|用户|主持人|数据库|命令|时间|状态|信息|服务器版本| PLUGIN_NAME |服务器状态|服务器密钥|
+-----+------+------------------+---------+-------- - -+------+------------+---------------------------- ---- +----------------+--------------------+----- --- -------+----------------+
| 191 | 191根|本地主机:54674 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |写SMtest_db |
| 192 | 192根|本地主机:54680 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |写SMtest_db |
| 193 | 193根|本地主机:54682 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |写SMtest_db |
| 195 | 195根|本地主机:54688 |测试数据库|查询| 0 |执行| /*SMProxy进程列表sql*/| 8.0.13 | mysql_native_password | mysql_native_password | 2 |写SMtest_db |
| 196 | 196根|本地主机:54692 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 197 | 197根|本地主机:54696 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 198 | 198根|本地主机:54700 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 199 | 199根|本地主机:54704 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 200 | 200根|本地主机:54708 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 201 | 201根|本地主机:54712 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 202 | 202根|本地主机:54716 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 203 | 203根|本地主机:54720 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 204 | 204根|本地主机:54724 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 205 | 205根|本地主机:54728 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 206 | 206根|本地主机:54732 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 207 | 207根|本地主机:54736 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 208 | 208根|本地主机:54740 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 209 | 209根|本地主机:54744 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 210 | 210根|本地主机:54748 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 211 | 211根|本地主机:54752 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 212 | 212根|本地主机:54756 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 213 | 213根|本地主机:54760 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 214 | 214根|本地主机:54764 |测试数据库|查询| 0 |执行| /*SMProxy进程列表sql*/| 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
| 215 | 215根|本地主机:54766 |测试数据库|睡眠| 75 | 75 | | 8.0.13 | mysql_native_password | mysql_native_password | 2 |读取SMtest_db |
+-----+------+------------------+---------+-------- - -+------+------------+---------------------------- ---- +----------------+--------------------+----- --- -------+----------------+当supervisord已经开始运行时,再次运行supervisord -c /etc/supervisord.conf会报错。
root@localhost:/data#supervisord -c /etc/supervisord.conf
Error: 另一个程序已在侦听我们的HTTP 服务器之一配置使用的端口。在启动supervisord 之前先关闭该程序。
如需帮助,请使用/bin/supervisord -h 如果您想重新启动supervisord,只需杀死supervisord并重新启动它:
root@localhost:/data# ps -ef | grep 主管
根7059 1 0 19:18 ? 00:00:00 /usr/bin/python /bin/supervisord -c /etc/supervisord.conf
根7291 5986 0 20:13 pts/0 00:00:00 grep --color=autosupervisord
root@localhost:/data#kill -s SIGTERM 7059
【高效Linux进程管理:Supervisor应用指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直想试试Supervisor,听说可以自动启动和监控进程,很理想啊!
有7位网友表示赞同!
在开发环境中使用Supervisor是不是会比较方便?
有7位网友表示赞同!
我有个需要定时运行的任务,用Supervisor会不会轻松很多?
有6位网友表示赞同!
请问Supervisor支持哪些类型的脚本或程序?
有13位网友表示赞同!
对于新手来说,学习Supervisor的难度怎么样?
有20位网友表示赞同!
Linux服务器上使用Supervisor有什么需要注意的吗?
有13位网友表示赞同!
有没有什么好用的supervisor配置文件模板可以分享吗?
有12位网友表示赞同!
Supervisor的日志记录功能比较完善吗?方便查看历史问题。
有20位网友表示赞同!
我想了解一下 Supervisor 和其他进程管理工具 (比如 monit ) 的区别?
有8位网友表示赞同!
用Supervisor管理多个项目,是否能做到灵活切换?
有16位网友表示赞同!
Supervisor 是否支持并发执行任务?
有15位网友表示赞同!
在使用Supervisor时,是如何实现远程监控和管理的?
有8位网友表示赞同!
我听说Supervisor可以根据进程状态自动执行操作,是真的吗?
有17位网友表示赞同!
能否用Supervisor来管理数据库进程等非脚本类型的程序?
有12位网友表示赞同!
想知道Supervisor有哪些扩展插件,有哪些功能特别强大?
有12位网友表示赞同!
想了解更多关于Supervisor的最佳实践,有什么资源可以推荐吗?
有16位网友表示赞同!
使用Supervisor可以提高服务器的稳定性和安全性吗?
有13位网友表示赞同!
Supervisor在实际生产环境中被广泛应用吗?
有7位网友表示赞同!
有没有什么在线学习 Supervisor 的教程或课程?
有17位网友表示赞同!
我目前是在Windows系统下开发,是否可以考虑用 supervisor 管理 Linux 服务器上的进程?
有17位网友表示赞同!