如果过去一分钟的平均服务器负载高于X,则重新启动Apache

时间:2019-07-04 09:32:26

标签: bash shell cron sh

我写了一个shell脚本并将其添加到我的cron中。它应该每分钟运行一次,并检查平均服务器负载(过去1分钟),如果超过40分钟,则应记录负载,日期,然后重新启动Apache httpd。这是我的脚本:

#!/bin/bash
LOGFILE=/home/user/public_html/domain.com/cron/restart.log
function float_to_int() {
echo $1 | cut -d. -f1
}
check=$(uptime | awk -F' *,? *' '{print $12}')
now=$(date)
checkk=$(float_to_int $check)
if [[ $checkk > 40 ]]; then
        echo $now $checkk >> $LOGFILE 2>&1
        /usr/bin/systemctl restart httpd.service
fi

如果我查看日志文件,则会看到以下内容:

Wed Jul 3 20:02:01 EDT 2019 70
Wed Jul 3 23:03:01 EDT 2019 43
Wed Jul 3 23:12:01 EDT 2019 9
Wed Jul 3 23:13:01 EDT 2019 7
Wed Jul 3 23:14:01 EDT 2019 6
Wed Jul 3 23:15:02 EDT 2019 5
Wed Jul 3 23:16:01 EDT 2019 5

某些事情显然是错误的,因为只有在负载超过40时才应该登录并重新启动Apache,但是从日志中可以看到负载为9、7、6、5和5。有人可以指出正确的方向吗? ?

2 个答案:

答案 0 :(得分:2)

来自man bash,第CONDITIONAL EXPRESSIONS节(重点是我的):

  

string1> string2
               如果string1在按字典顺序后排在string2之后,则为true。

您将要使用[[的{​​{1}}运算符,或者使用算术求值而不是-gt

[[

答案 1 :(得分:0)

这是GNU awk中的一个(由于strftime()而导致的GNU awk):

awk '
$1 > 0.4 {                                          # interval above 0.4
    logfile="./log.txt"                             # my logpath, change it
    print strftime("%c"), $1 >> logfile             # date and load to log
    cmd="/usr/bin/systemctl restart httpd.service"  # command to use for restarting
    if((ret=(cmd|getline res)) !=0 )                # store return value and result
        print "failed: " ret                        # if failed
    else
        print "success"
}' /proc/loadavg                                    # getting load avg from /proc