web-dev-qa-db-ja.com

バッシュでタイムスタンプ比較を実行するための最良の方法は何ですか

スパム行為を防ごうとしているアラートスクリプトがあるので、アラートが過去1時間以内に送信された場合に、別のアラートを送信しないように条件を設定します。条件が満たされるとすぐにアラートを受け取る必要があるため、問題を制御するまでメールを受け取る必要がないため、毎分条件をチェックするcronジョブがあります。これを達成するためにbashで時間を比較する最良の方法は何ですか?

38
Ichorus

はるかに簡単なのは、ダミーファイルの変更時刻としてタイムスタンプを保存することです。 GNU touchおよびdateコマンドは、これらの時間を設定/取得し、日付計算を実行できます。Bashには、ファイルが(-nt)または(-ot)より古い。

たとえば、最後の通知が1時間以上前の場合にのみ通知を送信するには:

touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
    #send notification...
    touch last_notification
fi
63
Bruno De Fraine

「テスト」を使用:

if test file1 -nt file2; then
   # file1 is newer than file2
fi

編集:イベントがいつ発生したかを知りたい場合は、「touch」を使用してファイルを作成し、後で「test」を使用して比較できます。

19
JesperE

Dateコマンドを使用して、2つの時間を標準形式に変換し、それらを減算します。おそらく、以前の実行時間をドットファイルに保存して、次のようなことをしたいと思うでしょう:

last = cat /tmp/.lastrun
curr = date '+%s'

diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
    # ...
fi

echo "$curr" >/tmp/.lastrun

(ありがとう、スティーブ。)

15