【问题标题】:Bash: Continuously check processes running or not with some parametersBash:使用某些参数持续检查进程是否正在运行
【发布时间】:2022-01-13 09:26:06
【问题描述】:

我想创建一个脚本来持续检查进程状态是否运行。如果进程不会运行,脚本应该捕获它并在几秒钟内重新启动它。如何在系统上连续运行此脚本以及如何通过 ---> 更改脚本 要点:它应该作为参数:尝试重新启动服务之间等待 1 秒,尝试次数 2 和 3 - 生成事件日志。 Nginx 是该过程的一个示例。可以更换。

#!/bin/bash 
SERVICE="nginx" 
if pgrep -x "$SERVICE" >/dev/null 
then 
    echo "$SERVICE is running" 
else 
    echo "$SERVICE stopped" 
    # start nginx if stopped 
    echo "$SERVICE starting" 
    systemctl start $SERVICE
fi

【问题讨论】:

  • 为什么不使用 systemd?
  • @wowbagger 我已经在脚本中使用了 systemctl。你是什​​么意思?我只想创建 bash 脚本。也许我会集成到 cron 以在操作系统上连续运行。但是参数我需要一些建议。
  • @Dylan_ 我猜 wowbagger 的意思是您可以配置 Nginx systemd 服务,使其在意外停止或崩溃时自动重启。您无需为此编写自己的脚本。
  • @Kent Nginx 是一个示例服务。它应该是可更换的。我需要用 bash 脚本来做。

标签: linux bash shell


【解决方案1】:

你可以试试这样的:

#!/bin/bash

service="nginx"
seconds=2
retries=3

until (( retries-- == 0 ))
do
    property=$(systemctl show --property MainPID "$service")

    if [[ $property == MainPID=0 ]]
    then
        echo "$service stopped"
        echo "$service starting"
        systemctl start "$service" >& /dev/null
    else
        echo "$service is running"
        exit
    fi

    sleep "$seconds"
done

echo "$service is broken"

【讨论】:

  • @Dylan_ 我更新了使用systemctl show --property MainPID 而不是systemctl status 的代码,因为它更快并且看起来更可靠。有了它,您还可以通过一个systemctl 调用来检查多个服务的状态,例如:props=( $(systemctl show --property MainPID service1 service2 etc...) )
猜你喜欢
  • 2020-05-03
  • 2010-12-21
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2015-05-28
  • 1970-01-01
相关资源
最近更新 更多