1

我想限制给定时间段内命令的执行次数。我知道一种方法可以做到这一点,但我的方法并不整洁,我希望能提出更好的方法来实现这一点。具体来说,我正在处理的场景如下:

我正在使用程序 Motion 来监控和记录来自网络摄像头的图像。该程序会保存图像并在检测到运动时执行命令。我希望它执行的命令之一是在检测到运动时向我发送电子邮件的简单命令。出现了一个困难,因为该命令最终可能每秒执行多次。这会很快导致在很短的时间内发送数千封电子邮件。我想我想要的是如下程序:

on motion detected
 Has it been more than 1 minute since motion was last detected?
  If it has, send a notification e-mail.
  If it has not, don't send a notification e-mail.

我想用一个简洁的命令来结束这个过程。我目前的方法涉及保存一个临时文件,我怀疑这不是最简洁的做事方式。

感谢您对此的任何想法!

4

2 回答 2

1

好吧,这是我每次检测到运动时运行的脚本类型:

#!/bin/bash
    #user variables #userSet
        timeIntervalInSecondsBetweenCommandExecutions=120
        lastExecutionTimeFileName="last_command_execution_time.txt"
        command=$(cat << 2012-08-20T1654
twidge update "@<Twitter account> motion detected $(date "+%Y-%m-%dT%H%M")";
echo "motion detected" | festival --tts
2012-08-20T1654
)
    # Get the current time.
        currentTimeEpoch="$(date +%s)"
    # Check if the last execution time file exists. If it does not exist, run the command. If it does exist, check the time stored in it against the current time.
        if [ -e ${lastExecutionTimeFileName} ]; then
            lastCommandExecutionTimeEpoch="$(cat "${lastExecutionTimeFileName}")"
            timeInSecondsSinceLastCommandExecution="$(echo "${currentTimeEpoch}-${lastCommandExecutionTimeEpoch}" | bc)"
            # If the time since the last execution is greater than the time interval between command executions, execute the command and save the current time to the last execution time file.
                if [ ${timeInSecondsSinceLastCommandExecution} -ge ${timeIntervalInSecondsBetweenCommandExecutions} ]; then
                    eval ${command}
                    echo "${currentTimeEpoch}" > "${lastExecutionTimeFileName}"
                fi
        else
            eval ${command}
        fi

简而言之,它使用文件来记住上次运行的时间。所以,这是一个答案,但我仍然认为它不优雅。

于 2012-08-21T19:26:24.247 回答
0

传统的方法是创建一个文件,使用它在其内容中或通过其元数据(mtime等)存储时间戳。没有其他标准方法可以在进程之外拥有持久信息 - 我假设您会认为数据库等是矫枉过正的。

motion但是,如果调用者(例如)阻塞等待您的进程完成,则可能有另一种选择。在这种情况下,您的脚本可能如下所示:

#!/bin/sh

echo "The Martians are coming!" | mail -s "Invasion" user@example.com

sleep 60

最后一行确保任何等待此脚本终止的调用者都必须等待至少 60 秒,这施加了最大速率限制。

于 2012-08-16T21:48:19.270 回答