目录
2.3 Daemontools-Encore(Daemontools的增强版)
2.3.2 Daemontools使用案例:监控Zookeeper
1. Circus-基于Python的进程管理工具
Circus 是一款基于 Python 开发的跨语言进程管理工具,专注于监控、管理和编排多个进程(支持 Python、Node.js、Java、Go 等任意语言的应用)。它提供了命令行接口、Web 监控界面和灵活的配置方式,适合在开发或生产环境中管理多个后台进程(如 API 服务、Worker 进程、定时任务等)。
1.1 服务安装
#安装
pip install circus
#(可选)安装 Web 界面依赖(默认已包含)
pip install circus[web] # 确保 Web 监控功能可用
1.2 配置文件示例
Circus 主要通过配置文件(支持 INI、YAML 格式)定义进程。以下是一个 INI 格式的示例(config.ini):
[circus]
# 主进程配置:日志文件、检查间隔(秒)
logfile = /var/log/circus/circusd.log
check_delay = 5 # 进程状态检查间隔
[watcher:api-server]
# 定义一个名为 api-server 的进程组
cmd = /usr/bin/node /opt/app/server.js # 启动命令(Node.js 应用)
numprocesses = 4 # 启动 4 个实例(利用多核)
autostart = true # 随 circusd 自动启动
autorestart = true # 进程退出时自动重启
working_dir = /opt/app # 工作目录
env = NODE_ENV=production,PORT=8000 # 环境变量
stdout_stream.class = FileStream # 标准输出日志配置
stdout_stream.filename = /var/log/circus/api-stdout.log
stdout_stream.max_bytes = 10485760 # 日志轮转(10MB)
stdout_stream.backup_count = 5 # 保留 5 个备份
stderr_stream.class = FileStream # 标准错误日志配置
stderr_stream.filename = /var/log/circus/api-stderr.log
[watcher:worker]
# 定义第二个进程组(Python 脚本)
cmd = /usr/bin/python /opt/app/worker.py
numprocesses = 2 # 2 个实例
autostart = true
autorestart = unexpected # 仅意外退出时重启
[plugin:web]
# 启用 Web 监控插件
use = circus.plugins.web # 加载 Web 插件
host = 0.0.0.0 # 监听地址(允许外部访问)
port = 8080 # Web 端口
1.3 启动与基本操作
1.3.1 启动 Circus 主进程
circusd --daemon config.ini # 后台启动(--daemon 可选)
1.3.2 通过 circusctl 管理进程
# 连接到 circusd(默认地址 localhost:5555)
circusctl
# 常用命令(在 circusctl 交互界面或直接执行)
circusctl status # 查看所有进程状态
circusctl start api-server # 启动 api-server 进程组
circusctl stop worker # 停止 worker 进程组
circusctl restart api-server:2 # 重启 api-server 的第 2 个实例
circusctl scale api-server=6 # 动态调整 api-server 实例数为 6 个
circusctl reloadconfig # 重新加载配置文件(不中断服务)
circusctl quit # 停止 circusd 及所有管理的进程
1.3.3 访问 Web 监控界面
启动后,通过 http://服务器IP:8080 访问 Web 界面,可查看进程列表、资源占用(CPU / 内存)、日志等实时信息。
1.4 常用命令
| 命令 | 说明 |
|---|---|
circusctl status | 查看所有进程状态 |
circusctl restart myapp | 重启指定进程 |
circusctl stop myapp | 停止指定进程 |
circusctl add myapp /path/to/app.py | 添加新应用 |
circusctl list | 列出所有管理的进程 |
2. Daemontools
2.1 软件安装
# 创建安装目录
mkdir /package
chmod 755 /package
# 下载并解压源码
cd /package
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
tar zxf daemontools-0.76.tar.gz
# 编译并安装
cd admin/daemontools-0.76
vim src/error.h # 修改:将extern int errno; 改为#include <errno.h>
package/install
2.2 基本使用流程
# 创建服务目录
cd /service
mkdir mydaemon
# 创建run脚本(启动服务的命令)
cd mydaemon
vim run
chmod 755 run
run脚本内容示例:
#!/bin/bash
exec 2>&1
exec /path/to/your/service
# 启动服务
supervise /service/mydaemon
# 查看服务状态
svstat /service/mydaemon
2.3 Daemontools-Encore(Daemontools的增强版)
Daemontools-Encore是Daemontools的增强版本,由Bruce G. Miller开发,提供了更易用的安装和管理方式。
2.3.1 安装Daemontools-Encore:
git clone https://github.com/bruceg/daemontools-encore.git
cd daemontools-encore
make
make install
2.3.2 Daemontools使用案例:监控Zookeeper
# 创建服务目录
cd /service
mkdir zookeeper
cd zookeeper
# 创建run脚本
vim run
chmod 755 run
run内容
#!/bin/bash
exec 2>&1
exec /mnt/zk/zookeeper-3.4.4/bin/zkServer.sh start
2.3.3 启动服务
supervise /service/zookeeper
2.3.4 验证是否成功
# 终止zookeeper进程
killall -9 zookeeper
# 检查是否自动重启
ps -aux | grep zookeeper
3. PM2-Node.js 应用专用的进程管理器
PM2(Process Manager 2)是一个Node.js 应用专用的进程管理器,但也支持 Python、Ruby、PHP 等其他语言的应用。它由 Node.js 开发,提供进程启动、停止、重启、负载均衡、日志管理、监控等功能,是 Node.js 生产环境的常用工具。
3.1 安装npm
# 使用 npm 安装
npm install pm2 -g
# 使用 yarn 安装
yarn global add pm2
# 更新 pm2
pm2 update
3.2 基本使用
# 启动应用
pm2 start app.js
pm2 start app.js --name "my-app"
# 管理进程
pm2 stop my-app
pm2 restart my-app
pm2 reload my-app # 零停机重载
pm2 delete my-app
# 查看状态
pm2 status
pm2 show my-app
pm2 monit # 实时监控
# 日志管理
pm2 logs
pm2 logs my-app
pm2 flush # 清空日志
3.3 配置文件管理
对于多应用或复杂配置,推荐使用 ecosystem.config.js 配置文件(支持 JSON/YAML 格式):
创建配置文件
pm2 init
编辑配置(示例):
module.exports = {
apps: [
{
name: "api-server", // 进程名
script: "./server.js", // 启动脚本
instances: "max", // 集群模式,进程数=CPU核心
exec_mode: "cluster", // 集群模式(默认fork)
env: {
NODE_ENV: "production", // 环境变量
},
log_date_format: "YYYY-MM-DD HH:mm:ss", // 日志时间格式
merge_logs: true, // 合并集群日志
autorestart: true, // 崩溃后自动重启
watch: false, // 禁用文件监听(生产环境推荐)
}
]
};
通过配置文件启动:
pm2 start ecosystem.config.js
3.4 开机自启配置
PM2 可通过 startup 命令生成系统自启脚本(兼容 systemd、sysvinit、upstart 等):
生成自启脚本
pm2 startup # 按提示执行输出的命令(需sudo权限)
保存当前进程列表(确保重启后恢复):
pm2 save
取消自启:
pm2 unstartup
4. Supervisor
Supervisor 是一个用 Python 编写的进程管理工具,专为类 Unix 系统设计。它的核心作用是将普通命令行进程变为后台守护进程(daemon)并进行监控,在进程异常退出时能自动重启,确保服务持续运行。
4.1 安装 Supervisor
# Ubuntu/Debian
sudo apt-get install supervisor
# CentOS/RHEL (需要先安装EPEL仓库)
sudo yum install epel-release
sudo yum install supervisor
# 通过pip安装(通用方法)
sudo pip install supervisor
4.2 配置文件结构
Supervisor 的配置主要分为两部分:
- 主配置文件:通常位于
/etc/supervisor/supervisord.conf或/etc/supervisord.conf。它定义了supervisord本身的全局设置。- 进程配置文件:推荐在
/etc/supervisor/conf.d/目录下为每个进程创建独立的.conf文件。主配置文件中的[include]部分通常会包含这些文件,例如files = /etc/supervisor/conf.d/*.conf。
4.3 配置一个被管理的进程
在 /etc/supervisor/conf.d/目录下创建一个配置文件(如 my_app.conf),内容示例
[program:my_app] ; 进程名称,必须唯一
command=/usr/bin/python3 /path/to/your/app.py ; 要执行的启动命令
directory=/path/to/your/app ; 命令执行前切换到的工作目录
autostart=true ; 是否随 supervisord 启动而自动启动
autorestart=true ; 进程退出后是否自动重启,可选 true(总是)、false(从不)、unexpected(仅意外退出时)
startsecs=5 ; 进程持续运行多少秒后才认为是启动成功
startretries=3 ; 启动失败后的重试次数
user=www-data ; 以哪个用户身份运行进程
stdout_logfile=/var/log/my_app.log ; 标准输出日志路径
stdout_logfile_maxbytes=50MB ; 单个日志文件最大大小
stdout_logfile_backups=10 ; 日志备份数量
redirect_stderr=true ; 是否将标准错误输出重定向到标准输出
environment=ENV_VAR="value",ANOTHER_VAR="value2" ; 设置环境变量
4.4 常用操作命令
使用 supervisorctl命令来管理:
| 命令 | 作用 |
|---|---|
|
| 查看所有进程的状态 |
|
| 启动某个进程 |
|
| 停止某个进程 |
|
| 重启某个进程 |
|
| 重新加载配置文件(不影响已运行进程) |
|
| 重新加载配置,并启动有变动的进程(常用) |
|
| 查看某个进程的日志输出 |
4.5 配置修改后的标准流程
sudo supervisorctl reread # 重新读取配置,确认语法无误
sudo supervisorctl update # 使新配置生效,会重启配置有变动的进程
4.6 高级用法
4.6.1 进程分组 (Group)
可以将多个相关的程序放入一个组进行统一管理。
[group:my_services]
programs=my_app,celery_worker,another_service ; 逗号分隔的程序名
然后可以操作整个组:
sudo supervisorctl stop my_services: # 停止组内所有进程
sudo supervisorctl start my_services: # 启动组内所有进程
4.6.2 启用 Web 管理界面
在主配置文件 (/etc/supervisor/supervisord.conf) 中取消注释或添加 [inet_http_server]部分:
[inet_http_server]
port=127.0.0.1:9001 ; Web界面监听端口,设为*:9001可允许外部访问
username=your_username ; 用户名(建议设置)
password=your_password ; 密码(建议设置强密码)
重启 supervisord后,即可通过浏览器访问 http://your-server-ip:9001进行监控和管理。
3976

被折叠的 条评论
为什么被折叠?



