CSSC-PC更新了1个文件
This commit is contained in:
parent
dbaa728f64
commit
f559171ae2
141
系统/Linux/进程守护.md
Normal file
141
系统/Linux/进程守护.md
Normal file
@ -0,0 +1,141 @@
|
||||
---
|
||||
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`** 的方式较为简单,但不如前两种方式高效。
|
||||
|
||||
根据你的需求选择合适的方式,并进行配置即可。
|
Loading…
Reference in New Issue
Block a user