2024-09-25 08:24:08 +00:00
|
|
|
|
---
|
|
|
|
|
tags:
|
|
|
|
|
- 代码块
|
|
|
|
|
- 鲁棒性
|
|
|
|
|
---
|
|
|
|
|
在 Linux 中,你可以通过多种方式配置守护进程来监控某个程序的状态,并在程序崩溃后自动重启它。比较常用的方法有以下几种:
|
|
|
|
|
|
|
|
|
|
### 1. 使用 `systemd` 配置守护进程
|
|
|
|
|
`systemd` 是现代 Linux 发行版中常见的初始化系统,它能够管理服务、定时任务等。你可以使用 `systemd` 配置一个守护进程,自动监控并重启某个程序。
|
|
|
|
|
|
|
|
|
|
#### 步骤:
|
|
|
|
|
1. **创建 systemd 单元文件**
|
|
|
|
|
假设你的程序叫做 `my_program`,将其放到 `/usr/local/bin/` 目录下。
|
|
|
|
|
|
|
|
|
|
你需要创建一个 `.service` 文件,通常存放在 `/etc/systemd/system/` 目录下。
|
|
|
|
|
|
|
|
|
|
执行以下命令来创建该文件:
|
|
|
|
|
```bash
|
|
|
|
|
sudo nano /etc/systemd/system/my_program.service
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. **配置 `.service` 文件内容**
|
|
|
|
|
以下是一个简单的配置文件示例:
|
|
|
|
|
|
|
|
|
|
```ini
|
|
|
|
|
[Unit]
|
|
|
|
|
Description=My Program
|
|
|
|
|
After=network.target # 表示这个程序应该在网络服务启动之后启动,具体需求可根据程序修改
|
|
|
|
|
|
|
|
|
|
[Service]
|
|
|
|
|
ExecStart=/usr/local/bin/my_program # 你的程序的启动命令
|
|
|
|
|
Restart=always # 如果程序崩溃或者退出,始终重启
|
|
|
|
|
RestartSec=5 # 崩溃后 5 秒钟后再重启
|
|
|
|
|
User=nobody # 可以指定以某个用户身份运行
|
|
|
|
|
StandardOutput=syslog # 输出到系统日志
|
|
|
|
|
StandardError=syslog # 错误信息输出到系统日志
|
|
|
|
|
|
|
|
|
|
[Install]
|
|
|
|
|
WantedBy=multi-user.target
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. **启动并启用服务**
|
|
|
|
|
保存文件后,执行以下命令来让 `systemd` 识别新的服务:
|
|
|
|
|
```bash
|
|
|
|
|
sudo systemctl daemon-reload
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
然后启动并启用服务:
|
|
|
|
|
```bash
|
|
|
|
|
sudo systemctl start my_program.service
|
|
|
|
|
sudo systemctl enable my_program.service
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这样,`systemd` 将会在程序崩溃后自动重启它。
|
|
|
|
|
|
|
|
|
|
4. **查看日志**
|
|
|
|
|
如果你想查看程序运行状态和日志,可以使用以下命令:
|
|
|
|
|
```bash
|
|
|
|
|
sudo systemctl status my_program.service
|
|
|
|
|
sudo journalctl -u my_program.service
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2. 使用 `supervisord`
|
|
|
|
|
`supervisord` 是一个守护进程管理工具,它可以监控并自动重启失败的进程。使用 `supervisord` 需要先安装它。
|
|
|
|
|
|
|
|
|
|
#### 步骤:
|
|
|
|
|
1. **安装 `supervisord`**
|
|
|
|
|
如果你的系统没有安装 `supervisord`,可以通过以下命令安装:
|
|
|
|
|
|
|
|
|
|
- 对于 Debian/Ubuntu 系统:
|
|
|
|
|
```bash
|
|
|
|
|
sudo apt-get install supervisor
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- 对于 CentOS/RHEL 系统:
|
|
|
|
|
```bash
|
|
|
|
|
sudo yum install supervisor
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. **配置 supervisord**
|
|
|
|
|
创建并编辑一个配置文件,比如 `/etc/supervisor/conf.d/my_program.conf`:
|
|
|
|
|
|
|
|
|
|
```ini
|
|
|
|
|
[program:my_program]
|
|
|
|
|
command=/usr/local/bin/my_program # 启动的程序命令
|
|
|
|
|
autostart=true # 启动 supervisord 时自动启动该程序
|
|
|
|
|
autorestart=true # 程序崩溃后自动重启
|
|
|
|
|
startsecs=5 # 程序启动后如果 5 秒内崩溃,则认为启动失败,继续重启
|
|
|
|
|
stderr_logfile=/var/log/my_program.err.log # 标准错误日志
|
|
|
|
|
stdout_logfile=/var/log/my_program.out.log # 标准输出日志
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. **启动并管理程序**
|
|
|
|
|
配置文件完成后,可以通过以下命令启动 `supervisord`:
|
|
|
|
|
```bash
|
|
|
|
|
sudo systemctl start supervisor
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
然后通过以下命令管理或查看进程状态:
|
2024-09-25 08:26:25 +00:00
|
|
|
|
```bash
|
2024-09-25 08:24:08 +00:00
|
|
|
|
sudo supervisorctl status
|
|
|
|
|
sudo supervisorctl restart my_program
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3. 使用 `cron` 来定期检测并重启程序
|
|
|
|
|
虽然不如 `systemd` 或 `supervisord` 优雅,但你也可以使用 `cron` 来定期检查程序是否在运行,并在其崩溃时重新启动它。
|
|
|
|
|
|
|
|
|
|
#### 步骤:
|
|
|
|
|
1. **编写检查脚本**
|
|
|
|
|
创建一个脚本,比如 `/usr/local/bin/check_my_program.sh`:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
if ! pgrep -x "my_program" > /dev/null
|
|
|
|
|
then
|
|
|
|
|
echo "my_program not running, starting it..."
|
|
|
|
|
/usr/local/bin/my_program &
|
|
|
|
|
fi
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这个脚本会检查名为 `my_program` 的进程是否正在运行,如果没有,则启动它。
|
|
|
|
|
|
|
|
|
|
2. **配置 `cron`**
|
|
|
|
|
使用 `crontab` 配置定期执行这个脚本:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
crontab -e
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
添加以下行,表示每分钟检查一次程序状态:
|
|
|
|
|
```bash
|
|
|
|
|
* * * * * /usr/local/bin/check_my_program.sh
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 总结:
|
|
|
|
|
- **`systemd`** 是推荐的方式,它能稳定地管理服务,并与现代 Linux 发行版集成良好。
|
|
|
|
|
- **`supervisord`** 适合需要更细粒度进程控制和日志管理的应用。
|
|
|
|
|
- **`cron`** 的方式较为简单,但不如前两种方式高效。
|
|
|
|
|
|
|
|
|
|
根据你的需求选择合适的方式,并进行配置即可。
|