From f559171ae2e91bb63f00812ab83ec28dc6ec6acb Mon Sep 17 00:00:00 2001 From: murmur Date: Wed, 25 Sep 2024 16:24:08 +0800 Subject: [PATCH] =?UTF-8?q?CSSC-PC=E6=9B=B4=E6=96=B0=E4=BA=861=E4=B8=AA?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 系统/Linux/进程守护.md | 141 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 系统/Linux/进程守护.md diff --git a/系统/Linux/进程守护.md b/系统/Linux/进程守护.md new file mode 100644 index 0000000..fda79b2 --- /dev/null +++ b/系统/Linux/进程守护.md @@ -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`** 的方式较为简单,但不如前两种方式高效。 + +根据你的需求选择合适的方式,并进行配置即可。 \ No newline at end of file