1

特定の時間内にコマンドを実行する回数を制限したいと考えています。私はこれを行う方法を知っていますが、私の方法はきちんとしていません。これを達成するためのより良い方法について提案をいただければ幸いです。具体的には、私が扱っているシナリオは次のとおりです。

プログラム Motion を使用して、Web カメラからの画像を監視および記録しています。プログラムは画像を保存し、モーションが検出されるたびにコマンドを実行します。実行したいコマンドの 1 つは、モーションが検出されたときに電子メールを送信する単純なコマンドです。このコマンドは 1 秒間に複数回実行される可能性があるため、問題が発生します。これにより、非常に短期間に数千通の電子メールが送信される可能性があります。私が欲しいと思うのは、次のような手順です。

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.

その手順を 1 つのきちんとしたコマンドにまとめたいと思います。私の現在のアプローチには、一時ファイルの保存が含まれますが、これは最も適切な方法ではないと思われます。

これについて考えてくれてありがとう!

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 に答える