我有一个bash脚本,用于检查外部温度计的温度,如果它低于规定的量,则会发出警报。然而,它所做的是在10秒钟后不断发送警报(这是它最初设计的方式)。我想要它做的是,如果它降到22度以下发送警报一次,如果它超过22度发送另一个警报,但再次只发一次等等。
#!/bin/bash
while true; do
val=$(cat /sys/bus/)
min=$(echo "22.0")
if [[ "$val" < "$min" ]]
then
sendmail "too cold"
sleep 10
else
echo "All ok"
sleep 10
fi
done
exit 0
答案 0 :(得分:2)
首先,我要从您放置它的地方取出sleep 10
并放入外部de if语句中。问题的出现是因为你在无限循环中执行脚本,这意味着它将被执行一次和另一次。
您始终可以使用指定目录中的触摸创建文件,并检查其是否存在:
#!/bin/bash
while true; do
val=$(cat /sys/bus/) #removed a ' typo
min=$(echo "22.0")
if [[ "$val" < "$min" ]]; then
if [ ! -f "/var/testdir/message1_sent" ]; then
sendmail "too cold"
touch /var/testdir/message1_sent
if [ -f "/var/testdir/message2_sent" ]; then
rm /var/testdir/message2_sent
fi
fi
else
if [ ! -f "/var/testdir/message2_sent" ]; then
echo "All ok"
touch /var/testdir/message2_sent
if [ -f "/var/testdir/message1_sent" ]; then
rm /var/testdir/message1_sent
fi
fi
fi
sleep 10
done
#exit 0 #This is not reached, you are always inside a loop
答案 1 :(得分:0)
我猜它会再次发送邮件,因为温度不超过22.0度(可能需要一段时间才能超过22.0度?)。您可以添加在发送电子邮件时发送的标志,然后只输入val&lt;如果未设置标志,则为min branch。当温度再次超过22.0度时,应清除标志,然后一切都应该再次起作用。
答案 2 :(得分:0)
您总是可以使用额外的变量来表示您已经发送过冷的通知(&lt; 22)而另一个用于Ok(&gt; 22)。当你第一次发送&#34;&lt;时,这些最初是假的。 22&#34;通知您将&lt; 22的变量翻转为true,将&gt; 22的变量翻转为false,当然如果您的变量为false,则修改脚本以仅发送通知。当您发送&#34;所有确定&#34;通知你再次将&lt; 22的变量翻转为false,将&gt; 22的变量翻转为true,这应该这样做。