我写了一个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。有人可以指出正确的方向吗? ?
答案 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