仅警报一次的Bash脚本

时间:2014-03-25 08:16:37

标签: bash scripting

我有一个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

3 个答案:

答案 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,这应该这样做。