linux 建议使用Bash脚本在特定条件下执行操作

5jvtdoz2  于 2022-11-28  发布在  Linux
关注(0)|答案(1)|浏览(146)

我已经编写了一个小的(希望如此)简单脚本的一部分,它检查一个URL是否有使用wget返回的错误。然后它将错误输出到一个日志文件中以供警报之用。然后我想做的是让一个服务自动重新启动。
我将通过cronjob每分钟运行一次此检查,因此,如果在重新启动服务后仍有错误,我不希望脚本再次重新启动服务。
有没有一个优雅的方式来实现这一点?
这是我到目前为止所拥有的,一个wget检查,如果错误代码5,输出到health.log文件并重新启动nginx,但是,我不希望在cronjob上运行时每60秒重新启动nginx。

#!bin/bash

URL='http://some-url-here/'
LOG='/var/log/nginx/health.log'

wget -q $URL
if [ $? = 5 ] ; then
echo "$(date). SSL Error." > $LOG
sudo service nginx restart
exit
fi
1aaf6o9v

1aaf6o9v1#

假设条件:

  • 如果我们创建一个新文件(restart.log)就可以了,否则我们可以在$LOG后面追加一个新行
  • 我们将每10分钟(即600秒)仅执行一次restart尝试
  • OP希望追加到当前$LOG(每次脚本运行时,当前代码覆盖/替换整个文件)

拟定方法:

  • 使用新文件存储尝试最后一个restart的历元时间
  • 在尝试restart之前,我们将当前历元与保存的历元进行比较,并且仅在历元的差异大于600秒时才继续(使用restart

修改OP的当前脚本:

#!/bin/bash                                        # add "/" at start of shebang path

URL='http://some-url-here/'
LOG='/var/log/nginx/health.log'

RLOG='/var/log/nginx/restart.log'
touch "$RLOG"

wget -q $URL

if [ $? = 5 ] ; then
    echo "$(date). SSL Error." >> "$LOG"           # replace ">" with ">>" so that we append to $LOG

    read -r prev_epoch < <(tail -1 "$RLOG")        # retrieve epoch of last restart attempt
    prev_epoch="${prev_epoch:-0}"                  # default to 0 if there is nothing in the file

    printf -v curr_epoch '%(%s)T'                  # use printf builtin to grab current epoch and save in variable 'curr_epoch'
    # curr_epoch=$((date '+%s'))                   # uncomment if 'printf -v' is not available in your system

    delta=$((curr_epoch - prev_epoch))

    if [[ "${delta}" -gt 600 ]] ; then
        sudo service nginx restart
        echo "${curr_epoch}" > "$RLOG"             # replace ">" with ">>" if you want to maintain a history of restart epochs; the "tail -1" should insure we only grab the 'last' entry
        exit
    else
        echo "it has only been ${delta} seconds since last restart attempt; skipping restart" >> "$LOG"
    fi
fi

相关问题