Перезапустите Apache, если средняя загрузка сервера за последнюю минуту выше, чем X - PullRequest
1 голос
/ 04 июля 2019

Я написал скрипт оболочки и добавил его в свой cron. Предполагается, что он запускается каждую минуту и ​​проверяет среднюю загрузку сервера за последнюю минуту, а если он превышает 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

Что-то явно не так, поскольку он должен регистрировать и перезапускать Apache только в том случае, если нагрузка превышает 40, но, как вы можете видеть из журналов, загрузка была 9, 7, 6, 5 и 5. Может ли кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

С man bash, сечение CONDITIONAL EXPRESSIONS (выделено мной):

string1> string2
True, если строка1 сортируется после строки2 лексикографически .

Вы либо захотите использовать оператор [[ -gt, либо использовать арифметическую оценку вместо [[:

if (( chekk > 40 )); then
0 голосов
/ 04 июля 2019

Вот один в GNU awk (GNU awk из-за strftime()):

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
...