实时监控文件数量

实时监控文件数量

我是 bash 脚本编写的新手,我正在尝试编写一个 bash 脚本,该脚本将监视在某个时间范围内(预计)发送特定数量的文件的路径。假设有 20 个文件预计在上午 9 点至上午 11 点期间收到。

该脚本必须能够执行以下操作:

  • 检测文件是否从源延迟。如果上午 9 点路径为空,则给予 10 分钟宽限期并发送电子邮件通知源延迟发送文件。
  • 在时间范围内,检测文件集是否不完整。给予 10 分钟宽限期,如果文件计数仍然不等于 20,则发送电子邮件通知,说明文件集不完整。
  • 如果未检测到问题,请发送确认电子邮件。

我正在考虑在 incrontab 上进行设置。仅当文件计数完成或上午 11:10 过后(有 10 分钟宽限期),脚本才会停止。

我需要建议如何实现前两个。我只能介绍预计不会出现问题的情况。我有想法,但不知道如何将其放入脚本中。

到目前为止,这就是我所拥有的:

版本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

您可以使用简单的cron工作来完成它。假设您希望09:10在文件计数为零时检查并发送邮件通知,11:10在文件计数小于 20 时检查并发送邮件通知。使用如下脚本:

#!/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 已安装。


笔记:

  • 时间和执行次数可以轻松定制。您可以运行它两次或每 N 分钟或任何您想要的时间,只需花费最少的精力来更改它。

  • 您编写代码来计算行数并发送一次邮件。您可以设置参数来指定需要多少个文件、要发送什么消息等等。它简单易读。

  • 对于实际计数,我们使用命令-printf的参数find。我们只为每个文件打印一个换行符,并计算换行符,因此可以处理任何文件名。

  • GNU bash 假设。

相关内容