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

4.5 KiB
Raw Blame History

tags
代码块
鲁棒性

在 Linux 中,你可以通过多种方式配置守护进程来监控某个程序的状态,并在程序崩溃后自动重启它。比较常用的方法有以下几种:

1. 使用 systemd 配置守护进程

systemd 是现代 Linux 发行版中常见的初始化系统,它能够管理服务、定时任务等。你可以使用 systemd 配置一个守护进程,自动监控并重启某个程序。

步骤:

  1. 创建 systemd 单元文件
    假设你的程序叫做 my_program,将其放到 /usr/local/bin/ 目录下。

    你需要创建一个 .service 文件,通常存放在 /etc/systemd/system/ 目录下。

    执行以下命令来创建该文件:

    sudo nano /etc/systemd/system/my_program.service
    
  2. 配置 .service 文件内容
    以下是一个简单的配置文件示例:

   [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
  1. 启动并启用服务 保存文件后,执行以下命令来让 systemd 识别新的服务:

    sudo systemctl daemon-reload
    

    然后启动并启用服务:

    sudo systemctl start my_program.service
    sudo systemctl enable my_program.service
    

    这样,systemd 将会在程序崩溃后自动重启它。

  2. 查看日志
    如果你想查看程序运行状态和日志,可以使用以下命令:

    sudo systemctl status my_program.service
    sudo journalctl -u my_program.service
    

2. 使用 supervisord

supervisord 是一个守护进程管理工具,它可以监控并自动重启失败的进程。使用 supervisord 需要先安装它。

步骤:

  1. 安装 supervisord 如果你的系统没有安装 supervisord,可以通过以下命令安装:

    • 对于 Debian/Ubuntu 系统:

      sudo apt-get install supervisor
      
    • 对于 CentOS/RHEL 系统:

      sudo yum install supervisor
      
  2. 配置 supervisord 创建并编辑一个配置文件,比如 /etc/supervisor/conf.d/my_program.conf

   [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  # 标准输出日志
  1. 启动并管理程序 配置文件完成后,可以通过以下命令启动 supervisord

    sudo systemctl start supervisor
    

    然后通过以下命令管理或查看进程状态:

   sudo supervisorctl status
   sudo supervisorctl restart my_program

3. 使用 cron 来定期检测并重启程序

虽然不如 systemdsupervisord 优雅,但你也可以使用 cron 来定期检查程序是否在运行,并在其崩溃时重新启动它。

步骤:

  1. 编写检查脚本 创建一个脚本,比如 /usr/local/bin/check_my_program.sh

    #!/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 配置定期执行这个脚本:

    crontab -e
    

    添加以下行,表示每分钟检查一次程序状态:

    * * * * * /usr/local/bin/check_my_program.sh
    

总结:

  • systemd 是推荐的方式,它能稳定地管理服务,并与现代 Linux 发行版集成良好。
  • supervisord 适合需要更细粒度进程控制和日志管理的应用。
  • cron 的方式较为简单,但不如前两种方式高效。

根据你的需求选择合适的方式,并进行配置即可。