我正在运行 Ubuntu 14.04,我想监视一个文件夹,如果每 30 分钟没有添加新文件,则发送一封邮件。
我也在下面提到过。
我不确定如何等待一段时间并检查文件夹中的新文件。
答案1
您也许可以做一些简单的事情,例如:
#!/bin/bash
targetDir="$1"
while true; do
files=("$targetDir"/*)
sleep 30m ## wait 30 minutes
files1=("$targetDir/"*)
if [[ ${#files[@]} == ${#files1[@]} ]]; then
echo "No new files added" | mail [email protected]
fi
done
将该脚本另存为~/bin/watch.sh
或任何你喜欢的内容,使其成为可执行文件(chmod a+x ~/bin/watch.sh
)并运行它,并将目标目录作为参数:
watch.sh /path/to/dir
现在,这是一种非常简单的方法,只是每 30 分钟计算一次文件数量。因此,如果删除了一个文件但添加了另一个文件,它会认为没有新文件。取最新文件的时间戳并检查它是否在 30 分钟前最后一次修改可能是一个更好的主意:
#!/bin/bash
targetDir="$1"
newest=0;
while true; do
## Wait for half an hour. This is done at the beginning of the loop
## to ensure we wait a half hour before the first check
sleep 30m
## Get the current time in seconds since the epoch
now=$(date '+%s')
for file in "$targetDir"/*; do
## Get the file's modification time in seconds since the epoch
lastMod=$(stat -c "%Y" "$file")
## Is this file newer than the current newest?
if [[ $lastMod -gt $newest ]]; then
newest=$lastMod
fi
done
## If the newest file is older than half an hour
if [[ $((now - newest)) -gt 1800 ]]; then
echo "No new files added since $(date -d '- 30 min')" |
mail [email protected]
fi
done
如果您不想一直运行这样的脚本,那么您可以编写一个检查时间戳的脚本,并每 30 分钟调用一次该脚本:
#!/bin/bash
targetDir="$1"
newest=0;
for file in "$targetDir"/*; do
## Get the file's modification time in seconds since the epoch
lastMod=$(stat -c "%Y" "$file")
## Is this file newer than the current newest?
if [[ $lastMod -gt $newest ]]; then
newest=$lastMod
fi
done
## Get the current time in seconds since the epoch
now=$(date '+%s')
## If the newest file is older than half an hour
if [[ $((now - newest)) -gt 1800 ]]; then
echo "No new files added since $(date -d '- 30 min')" |
mail [email protected]
fi
现在,将其另存为~/bin/watch.sh
并使其可执行(chmod a+x ~/bin/watch.sh
)。然后,运行crontab -e
并添加此行:
*/30 * * * * /home/techie/bin/watch.sh
保存文件(保存会添加 crontab)就大功告成了。脚本将每 30 分钟运行一次。
答案2
在检查新文件之前,我会在目录本身上使用“stat”并查看时间戳是否改变。
$ stat $PWD
File: ‘/home/paulm/SCRATCH’
Size: 6144 Blocks: 8 IO Block: 32768 directory
Device: 26h/38d Inode: 10937103831396301849 Links: 6
Access: (0775/drwxrwxr-x) Uid: ( 520/ paulm) Gid: ( 1020/ paulm)
Access: 2019-07-09 13:17:15.528000000 +0000
Modify: 2019-07-09 13:17:15.528000000 +0000
Change: 2019-07-09 13:17:15.528000000 +0000
Birth: -
$ touch bar
$ stat $PWD
File: ‘/home/paulm/SCRATCH’
Size: 6144 Blocks: 8 IO Block: 32768 directory
Device: 26h/38d Inode: 10937103831396301849 Links: 6
Access: (0775/drwxrwxr-x) Uid: ( 520/ paulm) Gid: ( 1020/ paulm)
Access: 2019-07-09 13:23:11.346000000 +0000
Modify: 2019-07-09 13:23:11.346000000 +0000
Change: 2019-07-09 13:23:11.346000000 +0000
Birth: -
如果目录中的日期发生变化,那么就值得寻找新文件,这应该更加高效。
答案3
到目前为止,答案都假设文件只会进入目录,而不会出去。但是,如果您有一个定期清空目录的脚本,该怎么办?那么脚本可能会错过文件 5 分钟前进入目录但已被处理并取出的事实。
另一个选择是使用inotifywait
用高效 C 语言编写的命令,用于监控文件和目录的创建和修改。您可以使用以下命令安装它:
sudo apt install inotify-tools
这伪代码合适的脚本如下:
- 等待 30 分钟或直到目录更改
- 目录有改变吗?
- 是吗?我们到达这里是因为目录已更改。返回并再次等待 30 分钟。
- 没有?我们来这里是因为 30 分钟已到。发送电子邮件并返回再等待 30 分钟。
您可以从类似的地方调用该脚本,/etc/rc.local
以便它在机器启动时运行。
这种方法的优点是您不是每 30 分钟检查一次目录,而是在目录最后一次更改后 30 分钟检查一次。
答案4
有一个实用工具可以完成这个任务: