リアルタイムでファイル数を監視

リアルタイムでファイル数を監視

私はbashスクリプトに初めてアクセスし、特定の時間内に特定の数のファイルが転送される(予想される)パスを監視するbashスクリプトを作成しようとしています。午前9時から午前11時の間に受信する予定のファイルが20個あるとします。

スクリプトは次のことができる必要があります。

  • ソースからファイルが遅延しているかどうかを検出します。午前9時にパスが空の場合、10分の猶予期間が与えられ、ファイル配信が遅れた原因を知らせるEメールが送信されます。
  • ファイルセットが時間範囲内で不完全かどうかを検出します。 10分の猶予期間が与えられ、ファイル数がまだ20個になっていない場合、ファイルセットが不完全であることを示す電子メール通知が送信されます。
  • 問題が見つからない場合は、確認メールをお送りください。

incrontabにインストールしようとしています。スクリプトは、ファイル数が完了した後、または午前11時10分(10分猶予期間)以降にのみ停止します。

最初の2つを実装する方法についてのアドバイスが必要です。問題が発生すると予想されない状況のみを説明できます。アイデアがありますが、これをスクリプトに適用する方法がわかりません。

これが私が今まで持っているものです:

バージョン1:

#!/bin/bash

hour=(9 10 11)
[email protected]
[email protected]

if [[ "${hour[@]}" =~ "$(date +"%H")" ]]; then
   if [[ $(ls /fake/path | wc -l) == 20 ]]; then
      echo -e "All files received" | mailx -s "All files received" -r $server $notify
   fi
fi

(出力の解析が推奨されていないため、ls以下のスクリプトを更新しました。):
バージョン2:

#!/bin/bash

hour=(9 10 11)
[email protected]
[email protected]

if [[ "${hour[@]}" =~ "$(date +"%H")" ]]; then
   echo $(date +"%Y-%m-%d %H:%M:%S") $1 >> /tmp/record.txt
   if [[ $(cat /tmp/record.txt | wc -l) == 20 ]]; then
      echo -e "All files received" | mailx -a /tmp/record.txt -s "All files received" -r $server $notify
   fi
fi

どんなアイデアでも大歓迎です。私はこれを間違った方法で見ているかもしれません。

ベストアンサー1

簡単な操作で可能ですcron09:10ファイル数が0になったら確認してEメール通知を送信し、11:10ファイル数が20個未満の場合は確認してEメール通知を送信したいとします。次のスクリプトを使用します。

#!/bin/bash

n="$1"
message="$2"
target_dir="/full/path/to/directory"

cnt=$(find "$target_dir" -type f -printf '\n' | wc -l)

if (( cnt < n )); then
    <your-mail-command-with-$message>
else
    <do-anything>
fi

ご覧のとおり、テストファイル数の値とメッセージはパラメータです。だからあなたはできます

crontab -e

この行を追加してください

10 9 * * * bash /full/path/to/the/scipt.sh 1 "No files yet"
10 11 * * * bash /full/path/to/the/scipt.sh 20 "Files less than 20"

そしてファイルを保存してください。これで新しいcrontabがインストールされました。


メモ:

  • 実行時間と回数を簡単にカスタマイズできます。最小限の労力で変更するには、2回またはN分ごとに、または必要な時間に実行できます。

  • 行数を計算し、電子メールを一度送信するコードを作成します。パラメータを設定して、必要なファイル数、送信するメッセージなどを指定できます。シンプルで読みやすいです。

  • 実際の数を計算するには、コマンド-printfのパラメータを使用しますfind。ファイルごとに1つの改行文字を印刷して改行数を数えることで、すべてのファイル名を処理できます。

  • GNU bashの仮定。

おすすめ記事