menu Chancel's blog
rss_feed
Chancel's blog
有善始者实繁,能克终者盖寡。

CentOS7配置supervisor实现后台进程运行

作者:Chancel Yang, 创建:2018-09-27, 字数:1661, 已阅:691, 最后更新:2024-03-10

Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,用于监听、启动、停止、重启一个或多个进程

安装如下

Bash
sudo yum update
sudo yum install supervisor
sudo systemctl enable supervisord
sudo systemctl start supervisord

通常情况下,supervisor自定义脚本位于以下2个位置

  • /etc/supervisor.d
  • /etc/supervisor/conf.d

下面是我常用的脚本示例,更多详细设置可以参考官网配置文档)

INI
[program:blog]
# 程序启动目录
directory=/home/chancel/apps/blog
# 程序启动命令
command=/home/chancel/apps/blog/venv/bin/gunicorn --pid /home/chancel/apps/blog/pid --bind unix:/home/chancel/apps/blog/socket flaskr:app
# 开机自启
autostart=true
# 在进程挂掉后自动拉起
autorestart=true
# 日志配置
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=10MB
# 运行用户
user=chancel
# 运行环境
environment=PATH="/home/chancel/apps/blog/venv/bin:%(ENV_PATH)s"
environment=FLASKR_CONFIG="/home/chancel/apps/blog/flaskr-prod.json"

添加脚本后,我们可以使用supervisorctl热启动刚才添加的脚本进程

Bash
sudo supervisorctl update

supervisorctl是用于操作管理supervisor后台进程的CLI,常见操作如下

Bash
# 打印所有后台进程状态
sudo supervisorctl status
# 启动/停止/重启 后台进行
sudo supervisorctl start/stop/restart [progress_name]
# 重新读取所有后台进程(谨慎:这会重启所有后台进程)
sudo supervisorctl reload
# 热加载新添加的程序
sudo supervisorctl update

如果你需要web界面来监控后台进程的运行情况,可以编辑/etc/supervisor.conf,如下所示开放web接口页面用于监控后台进程运行状况

INI
...
[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)
...

[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
gravatar
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]