四种Linux进程管理工具使用详解
目录
1. Circus-基于Python的进程管理工具
1.1 服务安装
1.2 配置文件示例
1.3 启动与基本操作
1.3.1 启动 Circus 主进程
1.3.2 通过 circusctl 管理进程
1.3.3 访问 Web 监控界面
1.4 常用命令
2. Daemontools
2.1 软件安装
2.2 基本使用流程
2.3 Daemontools-Encore(Daemontools的增强版)
2.3.1 安装Daemontools-Encore:
2.3.2 Daemontools使用案例:监控Zookeeper
run内容
2.3.3 启动服务
2.3.4 验证是否成功
3. PM2-Node.js 应用专用的进程管理器
3.1 安装npm
3.2 基本使用
3.3 配置文件管理
3.4 开机自启配置
4. Supervisor
4.1 安装 Supervisor
4.2 配置文件结构
4.3 配置一个被管理的进程
4.4 常用操作命令
4.5 配置修改后的标准流程
4.6 高级用法
4.6.1 进程分组 (Group)
4.6.2 启用 Web 管理界面
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
进行监控和管理。