我的服务器总是在达到高平均负载时关闭。我已经优化了我的 Apache、MySQL。但在交通拥堵的时候我无法阻止。所以我尝试编写一些 shell 来控制平均负载。
#!/bin/bash
check=`uptime | sed 's/\./ /' | awk '{print $10}'`
if[$check -gt 5]
then
/usr/bin/systemctl restart httpd.service
fi
但当我原谅脚本时它报告错误
/var/www/html/load_average.sh: line 3: if[0.98, -gt 5]: command not found
/var/www/html/load_average.sh: line 4: syntax error near unexpected token `then'
/var/www/html/load_average.sh: line 4: `then'
还有一个问题,如何用cronjob每10秒运行一次脚本?
另一个工作代码,分享给大家:
#!/bin/bash
check=$(uptime | tr -d ',' | awk '{print $10}')
if [[ $check > 5 ]]; then
/usr/bin/systemctl restart httpd.service
fi
在 cronjob 部分
* * * * * /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 10; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 20; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 30; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 40; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 50; /var/www/html/load_average.sh >/dev/null 2>&1
答案1
您必须用空格将括号与数据分开,如下所示:
for I in 0 1 2 3 4 5; do
check=$(uptime | tr -d ',.' | awk '{print $10}')
if [ "$check" -gt 5 ]; then
/usr/bin/systemctl restart httpd.service
fi
sleep 10
done
在 UNIX 中,[ 实际上是一个 shell 命令。当 shell 用 $check 变量的值替换它时,它会尝试查找结果命令,因此会出现错误。此外,我建议您引用 $check 变量,就好像它被空字符串或空格替换一样,它会出现语法错误。
关于你的 crontab 问题,执行crontab -e并将这样的条目添加到您的文件中:
* * * * * /PATH/TO/YOUR/SCRIPT
Cronjobs 的最小分辨率运行时间为 1 分钟,因此,您必须使用循环每 10 秒重复检查 6 次。
答案2
if[0.98, -gt 5]
Bash 不能进行浮点运算。您可以这样做if (( 98 > 500 ))
- 双圆括号允许算术表达式,并且变量扩展是自动完成的,因此 if (( check > 500 ))
如果您的变量是$check
.幸运的是,awk 确实可以很好地处理基本算术。
#!/bin/bash
check=$(LC_ALL=C uptime | awk '{print 100*$10 }')
if (( check > 5 ))
then
/usr/bin/systemctl restart httpd.service
fi
现在,反引号已被弃用很长时间了。
然而,在太忙时重新启动 Web 服务器可能会惹恼足够多的访问者,从而降低平均负载。它不会锁定为正确的解决方案,因为它增加了工作量。也许分析器可能有助于找到瓶颈。
也许更好的方法来限制 Web 服务器可能导致的平均负载,存在于项目内部 - 我只能提供如何改进 shell 脚本的建议。
LC_ALL 设置可能只在我的机器上需要,它默认使用德语环境,并将 0.83 显示为 0,83。但也不会错。