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

25 天前
 wisefree

最近有个需求,监控某个守护进程,如果进程不存在,则重启这个进程,打算写一个 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
650 次点击
所在节点   Bash
10 条回复
ysc3839
25 天前
为什么不直接用 systemd 启动目标进程?
wisefree
25 天前
@ysc3839 要监视进程是否运行,systemd 直接启动进程,进程 die 后,无法自动重启
37Y37
25 天前
@wisefree 再了解下 systemd
ysc3839
25 天前
@wisefree systemd 怎么不能自动重启?你自己发的配置文件里就写了 Restart=on-failure 呀,不能自动重启的话,你写来干嘛?
Remember
25 天前
@wisefree 你是对 systemd 有什么误解吗?
wisefree
25 天前
@ysc3839 我再搜下 systemd ,确实不太懂这个,临时想出的 bash 脚本,然后用 chatgpt 写了一个服务
wisefree
25 天前
@37Y37 好的,我再去搜下相关知识,多谢
wisefree
25 天前
@Remember 确实有误解,之前没有了解 systemd 的用法,就用了 chatgpt 写的 service
Remember
25 天前
@wisefree 直接用 systemd 守护就可以了,崩了自动重启。systemd 之所以被骂的很惨也慢慢统一各个发行版,不是没有原因的。
wisefree
24 天前
@Remember 嗯嗯,刚刚大致搜索了 systemd ,原来它这么强大

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1036524

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX