网站首页 Linux进程管理工具Supervisor
Linux进程管理工具Supervisor
时间:2019-09-13 13:35:23 作者:Tinywan 浏览量:12312

简述

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

安装

配置文件

目录结构

supervisor
├── conf.d
│   └── echo_time.conf      -- 业务配置文件
└── supervisord.conf        -- 主配置文件,一般不需要改动
  • 使用 apt-get 安装后,supervisor 的主配置文件在/etc/supervisor/supervisord.conf

  • 子进程配置文件在/etc/supervisor/conf.d/*.conf

supervisord 和 supervisorctl的关系

supervisord 是主进程。

  • 常用命令

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

    • 查看服务状态:`sudo systemctl status supervisor.service`

    • 开启服务:`sudo systemctl start supervisor.service`

    • 停止服务:`sudo systemctl stop supervisor.service`

    • 重启服务:`sudo systemctl restart supervisor.service`

    • 开机启动项:`sudo systemctl enable supervisor.service`

  • supervisor.service 文件

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]

ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]

WantedBy=multi-user.target

supervisorctl 是客户端程序,用于向 supervisord 服务发起命令。

  • 所有命令,通过 supervisorctl -h 可以查看帮助说明

sudo supervisorctl  help

default commands (type help 
  • 控制子进程命令

# 停止某一个进程,program_name 为 [program:x] 里的 x
supervisorctl stop program_name
# 启动某个进程
supervisorctl start program_name
# 重启某个进程
supervisorctl restart program_name
# 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
supervisorctl stop groupworker:
# 结束 groupworker:name1 这个进程 (start,restart 同理)
supervisorctl stop groupworker:name1
# 停止全部进程,注:start、restart、stop 都不会载入最新的配置文件
supervisorctl stop all
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl update
  • 修改进程配置文件后,只要 sudo systemctl restart supervisor.service则会自动加载哦

示例

以简单的/home/www/python/echo_time.sh 为例

#/bin/bash

while true;
do
    echo `date +%Y-%m-%d,%H:%m:%s`
    sleep 2
done
  • /etc/supervisor/conf.d/新增子进程配置文件echo_time.conf

; /etc/supervisor/conf.d/echo_time.conf

[program:echo_time]


command     = /usr/bin/env sh /home/www/python/echo_time.sh
directory   = /home/www/python
user        = www
startsecs   = 3

redirect_stderr         = true
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups  = 10
stdout_logfile          = /home/www/python/log/echo_time.log
  • 然后启动程序:

$ supervisorctl reread
$ supervisorctl update

这两个命令分别代表重新读取配置、更新子进程组
这样刚才添加的 echo_time脚本就常驻运行起来了。可以通过日志查看运行情况:

tail -f log/echo_time.log 
2018-12-22,22:12:1545490695
2018-12-22,22:12:1545490697
2018-12-22,22:12:1545490699
2018-12-22,22:12:1545490701
  • 也可以使用 sudo supervisorctl status查看子进程运行情况:

sudo supervisorctl status
echo_time                        RUNNING   pid 28906, uptime 0:08:36

web界面操作

  • 需要开启主配置文件 supervisord.conf注释掉的这4行 (/etc/supervisor/supervisord.conf)

[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9001        ; (ip_address:port specifier, *:port for ;all iface)
;username=www              ; (default is no username (open server))
;password=www123456               ; (default is no password (open server))

注意:如果修改配置文件时, [inet_http_server]这一行被注释,会导致不仅web需要认证,命令行使用 supervisorctl也需要认证,这时候就需要在交互式命令行里输入用户名、密码才能进行下一步的操作。

  • 浏览器访问:http://myip:9001 ,输入用户名、密码后,即可看到web页面:

遇到的错误

  • Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord

监控工具

参考


附件下载
最新评论