obsidian-notes/系统/Linux/进程守护.md
2024-09-25 16:26:25 +08:00

141 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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
```
然后通过以下命令管理或查看进程状态:
```bash
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`** 的方式较为简单,但不如前两种方式高效。
根据你的需求选择合适的方式,并进行配置即可。