V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wisefree
V2EX  ›  Bash

Linux bash 脚本监控和重启一个守护进程

  •  
  •   wisefree · 14 天前 · 490 次点击

    最近有个需求,监控某个守护进程,如果进程不存在,则重启这个进程,打算写一个 bash 脚本和 service 服务满足这个需求。

    1. 通过 systemctl start monitor_process.service, 启动监控
    2. 通过 systemctl start monitor_process.service ,停止监控,同时杀死启动的进程。
    3. 这个服务必须是在系统所有服务启动之后,才启动该服务

    看到 stackoverflow的高赞回答后,不知道这样写的脚本是不是合适的,有没有更加好实践。

    我对 stackoverflow 高赞回答表示怀疑,其中jobs -p,无法列出后台的守护进程。因为一般编写守护进程代码时,都是 fork 两次并重新设置会话 setsid

    trap 'kill $(jobs -p)' EXIT; until myserver & wait
    

    monitor_process.sh

    
    #!/bin/bash
    
    this_bash_pid=$$
    exe_name="thisIsExample"
    
    # 定义一个函数来杀死进程
    kill_process() {
      if [ -n "${PID}" ]; then
        kill -9 ${PID}
      fi
      exit
    }
    
    # 使用 trap 命令捕获 TERM, INT 和 EXIT 信号
    trap 'kill_process' TERM INT EXIT
    
    while true
    do
      output=$(ps -ef | grep ${exe_name} | grep -v grep | grep -v ${this_bash_pid})
    
      if [ $? -eq 0 ];then
        PID=$(echo $output | awk '{print $2}')
        echo "${exe_name} :${PID} is running"
      else
        ./${exe_name} &
    
        output=$(ps -ef | grep ${exe_name} | grep -v grep | grep -v ${this_bash_pid})
        echo $output
        PID=$(echo $output | awk '{print $2}')
        echo $PID
      fi
      sleep 1
    done
    
    

    monitor_process.service

    
    [Unit]
    Description=Monitor Process Service
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/monitor_process.sh
    Restart=on-failure
    RestartSec=30
    
    [Install]
    WantedBy=multi-user.target
    
    10 条回复    2024-04-28 22:17:11 +08:00
    ysc3839
        1
    ysc3839  
       14 天前 via Android   ❤️ 1
    为什么不直接用 systemd 启动目标进程?
    wisefree
        2
    wisefree  
    OP
       14 天前
    @ysc3839 要监视进程是否运行,systemd 直接启动进程,进程 die 后,无法自动重启
    37Y37
        3
    37Y37  
       14 天前 via Android   ❤️ 1
    @wisefree 再了解下 systemd
    ysc3839
        4
    ysc3839  
       14 天前 via Android
    @wisefree systemd 怎么不能自动重启?你自己发的配置文件里就写了 Restart=on-failure 呀,不能自动重启的话,你写来干嘛?
    Remember
        5
    Remember  
       14 天前   ❤️ 1
    @wisefree 你是对 systemd 有什么误解吗?
    wisefree
        6
    wisefree  
    OP
       14 天前
    @ysc3839 我再搜下 systemd ,确实不太懂这个,临时想出的 bash 脚本,然后用 chatgpt 写了一个服务
    wisefree
        7
    wisefree  
    OP
       14 天前
    @37Y37 好的,我再去搜下相关知识,多谢
    wisefree
        8
    wisefree  
    OP
       14 天前
    @Remember 确实有误解,之前没有了解 systemd 的用法,就用了 chatgpt 写的 service
    Remember
        9
    Remember  
       14 天前   ❤️ 1
    @wisefree 直接用 systemd 守护就可以了,崩了自动重启。systemd 之所以被骂的很惨也慢慢统一各个发行版,不是没有原因的。
    wisefree
        10
    wisefree  
    OP
       13 天前
    @Remember 嗯嗯,刚刚大致搜索了 systemd ,原来它这么强大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3157 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:16 · PVG 22:16 · LAX 07:16 · JFK 10:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.