正确离线安装supervisor
supervisor简介
supervisor是一个用python语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制。
supervisor 会涉及三个重要的命令
- supervisord
可以理解成supervisor的服务端
运行supervisor时会启动一个进程supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启
- supervisorctl
可以理解成supervisor的客户端
supervisorctl是命令行管理工具,可以用如下命令来进行子进程的管理,如:
- echo_supervisord_conf
用来生成默认的配置文件,一般生成默认文件为 supervisor.conf
supervisor安装的前期准备(全部使用压缩包的方式)
supervisor是用python写的运行在linux下的进程管理工具,安装supervisor的时候依赖 python的一些包,它依赖:python、setuptools、meld3
1、python安装
可以参考此处安装python: https://www.cnblogs.com/winte...下载python链接:https://www.python.org/ftp/py...
下载相应的压缩包,如:wget https://www.python.org/ftp/py...
tar -xvf Python-3.6.8.tgz
2、setuptools安装
https://pypi.python.org/pypi/...
下载压缩包,用tar解压压缩包,安装,如
tar -zxvf setuptools-0.6c11.tar.gz cd setuptools-0.6c11 python setup.py install
3、meld3安装
https://pypi.python.org/pypi/...
tar -zxvf meld3-1.0.2.tar.gz cd meld3-1.0.2 python setup.py install
4、supervisor安装
tar -zxvf supervisor-3.3.1.tar.gz cd supervisor-3.3.1 python setup.py install
此处 supervisor安装后会生成我们关心的如下几个可执行程序:
- supervisord 路径
supervisord: /usr/local/bin/supervisord
- supervisorctl 路径
supervisorctl: /usr/local/bin/supervisorctl
- echo_supervisord_conf 路径
echo_supervisord_conf: /usr/local/bin/echo_supervisord_conf
验证supervisor是否安装成功
supervisorctl --help
supervisor配置
创建必要目录和文件
- 创建 /etc/supervisor 目录
mkdir /etc/supervisor
- echo_supervisord_conf 生成supervisord.conf
echo_supervisord_conf > /etc/supervisor/supervisord.conf
修改/etc/supervisor/supervisord.conf文件内容
- 将unix_http_server 下的 file 路径改掉,如下:
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
- 将supervisord 下的logfile 路径 和 pidfile 路径 改掉,如下:
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
- 将include 下的 files 路径改掉,如下:
[include] files = conf.d/*.conf
根据上述修改的路径,创建相应的文件和添加权限
创建文件:
touch /var/run/supervisor.sock
touch /var/log/supervisord.log
touch /var/run//supervisord.pid
mkdir /etc/supervisor/conf.d
添加权限
chmod 777 /var/run chmod 777 /var/log
编写自己需要监控的子进程程序
子程序配置文件的编写
在 /etc/supervisor/conf.d 目录下创建自己的子进程配置文件,如:
在 /etc/supervisor/conf.d 创建文件 test.conf
[program:test]
process_name=%(program_name)s_%(process_num)02d
command= go run main.go # 运行命令
directory=/home/qb/ # 运行文件目录
autostart=true # 自动启动
autorestart=true # 自动重新启动
user=root # 哪一个用户执行
redirect_stderr=true #重定向错误
子程序的编写
其中上述 main.go 是我临时写的一个demo程序,简单循环1秒钟写入字符串到文件中(写到文件中是为了便于查看效果),如:
package main
import ( "fmt" "os/exec" "time")
func main() {
for {
cmd := exec.Command("/bin/bash", "-c", `echo 222 >> a.txt`)
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)
return
}
//执行命令
if err := cmd.Start(); err != nil {
fmt.Println("Error:The command is err,", err)
return
}
fmt.Println(stdout)
time.Sleep(time.Second * time.Duration(1))
}
启动superviosr
1、unlink一下
unlink /var/run/supervisor.sock
2、启动supervisor:
supervisord -c /etc/supervisor/supervisord.conf
3、查看程序运行状态
supervisorctlstatus
查看效果
子程序是 每间隔1秒钟 向 a.txt文件中写入字符串 222
进一步测试
- 删掉子进程,测试supervisor是否会拉起子进程
将supervisor加入到开启启动服务中
1、写服务文件
vim /usr/lib/systemd/system/supervisord.service
supervisord.service
[Unit]
Description=Supervisor daemon
[Service]
Type=forking ExecStart=/usr/local/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl shutdown
ExecReload=/usr/local/bin/supervisorctl reload
KillMode=process Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
2、使能服务
systemctl enable supervisord
3、验证是否使能成功
systemctl is-enabled supervisord
出现enable说明成功
4、重启机器验证 supervisor是否随开机
常用命令提示
service supervisord start #启动程序
service supervisord stop #停止程序
service supervisord status #查看状态
supervisorctl shutdown #关闭所有任务
supervisorctl stop|start 子程序名字 #启动或停止服务
supervisorctl status #查看所有任务状态
异常情况提供参考
切记一定要把目录名,文件名 全部写正确,不要自己坑了自己!!
1、error: , [Errno 111] Connection refused: file: /usr/lib64/python2.6/socket.py line: 567
解决方式: 使用指定配置文件的方式处理
supervisord -c /etc/supervisor/supervisord.conf
2、初始化配置文件 echo_supervisord_conf 报错
解决方式:手动创建配置文件路径
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
3、操作supervisorctl 查看没有test进程
解决方式:/etc/supervisor/supervisord.conf 中 打开 include 模块
4、Unlinking stale socket /tmp/supervisor.sock
解决方式:
unlink /var/run/supervisor.sock
作者:小魔童哪吒