我是shell脚本的新手,我想编写一个脚本来监控CPU使用率,如果CPU使用率达到阈值,它应该按top命令打印CPU使用率,这是我的脚本,这给了我错误的错误号码并且也不在日志文件中存储任何值
while sleep 1;do if [ "$(top -n1 | grep -i ^cpu | awk '{print $2}')">>sy.log - ge "$Threshold" ]; then echo "$(top -n1)">>sys.log;fi;done
答案 0 :(得分:0)
您的脚本需要缩进并存储到文件中,特别是如果您不熟悉shell!
#!/bin/sh
while sleep 1
do
if [ "$(top -n1 | grep -i ^cpu | awk '{print $2}')">>sy.log - ge "$Threshold" ]
then
echo "$(top -n1)" >> sys.log
fi
done
你的情况看起来有点奇怪。它可能有效,但看起来非常复杂。将中间结果存储在变量中,并对其进行评估。 然后,您将立即在“-ge”上看到语法错误。
出于安全原因,您必须将日志文件存储在绝对路径中。使用变量来简化阅读。
#!/bin/sh
LOGFILE=/absolute_path/sy.log
WHOLEFILE=/absolute_path/sys.log
Thresold=80
while sleep 1
do
TOP="$(top -n1)"
CPU="$(echo $TOP | grep -i ^cpu | awk '{print $2}')"
echo $CPU >> $LOGFILE
if [ "$CPU" -ge "$Threshold" ] ; then
echo "$TOP" >> $WHOLEFILE
fi
done
答案 1 :(得分:0)
你有几个错误。
sy.log
,则shell不再提供该输出。您可以使用tee
。-ge
之前的短划线后面不能有空格。另外,一些风格的评论:
grep x | awk '{y}'
是useless use of grep
;这可以有效地,更经济地(以及更优雅地)被重写为awk '/x/{y}'
echo "$(command)"
是useless use of echo
- 不是交易破坏者,但您只需要command
;没有必要捕获它打印到标准输出的内容,因此您可以将该文本打印到标准输出。 top -n 1
的输出,则无需真正运行两次。补充说明:
top
的版本,它在第二个字段中打印带有加载的CPU前缀 - 表达式是否正确?)if
的条件。#!/bin/sh
while sleep 1
do
if top=$(top -n 1 |
awk -v thres="$Threshold" '1; # print every line
tolower($1) ~ /^cpu/ { print $2 >>"sy.log";
exitcode = ($2 >= thres ? 0 : 1) }
END { exit exitcode }')
then
echo "$top" >>sys.log
fi
done
你真的想要有两个几乎同名的日志文件,或者这是一个错字?在日志中包含时间戳可能对故障排除和实际使用日志文件都很有用。