【发布时间】:2017-02-10 16:57:29
【问题描述】:
在我用于服务器监控的自定义 bash 脚本中,实际上是为了强制我的 CentOS 服务器采取一些措施并在资源超载的时间超过预期时提醒我,我收到以下错误
第 17 行:[: 5.74: 需要整数表达式 *
现在,根据定义,所有 iostat 结果都是浮点数,我已经在 iostat 命令 (WAIT) 中使用了awk,那么如何让我的 bash 脚本期待一个而不是整数?
** 值 5.74 代表当前 iostat 结果
#!/bin/bash
if [[ "`pidof -x $(basename $0) -o %PPID`" ]]; then
# echo "Script is already running with PID `pidof -x $(basename $0) -o %PPID`"
exit
fi
UPTIME=`cat /proc/uptime | awk '{print $1}' | cut -d'.' -f1`
WAIT=`iostat -c | head -4 |tail -1 | awk '{print $4}' |cut -d',' -f1`
LOAD=`cat /proc/loadavg |awk '{print $2}' | cut -d'.' -f1`
if [ "$UPTIME" -gt 600 ]
then
if [ "$WAIT" -gt 50 ]
then
if [ "$LOAD" -gt 4 ]
then
#action to take (reboot, restart service, save state sleep retry)
MAIL_TXT="System Status: iowait:"$WAIT" loadavg5:"$LOAD" uptime:"$UPTIME"!"
echo $MAIL_TXT | mail -s "Server Alert Status" "mymail@foe.foe"
/etc/init.d/httpd stop
# /etc/init.d/mysql stop
sleep 10
# /etc/init.d/mysql start
/etc/init.d/httpd start
fi
fi
fi
CentOS 6.8 版(最终版)2.6.32-642.13.1.el6.x86_64
【问题讨论】:
-
Bash 只有整数数学;你需要使用bash以外的工具(比如awk)来做浮点数。
-
但是,这更容易(容易得多!),因为您要与整数常量进行比较。
-
顺便说一句,在 bash 中做浮点数学一般是BashFAQ #22。
-
...另外,不需要
cat | awk | cut--awk可以完成所有三个工具的工作。awk '{ print int($1) }' < /proc/uptime。使用cat foo | bar通常比bar <foo效率低——实际上,如果读取其输出的内容类似于sort可以启动多个线程来处理,那么使用cat会使事情效率降低很多当给定一个可查找的句柄时,文件的不同部分是并行的,因为根据定义,管道只能从前面读取(所以你不能让多个线程同时读取不同的部分)。 -
为了获取 iowait 百分比为整数,我可能会使用
iostat -c | awk 'NR == 4 { print int($4 * 100) }'。
标签: linux bash shell monitoring iostat