我正在尝试制作一个 FIFO 脚本,当磁盘使用量达到限制时,它会不断删除文件。我已使用该find
命令,以便文件数量不会成为运行脚本的限制。但我收到一个错误
/share/capture/per.sh: line 13: find /share/capture/job1/ -type f -name "*.pcap": division by 0 (error token is "share/capture/job1/ -type f -name "*.pcap"")
我制作的脚本如下:
#!/bin/bash
limit=10
#get usage percentage
per=$(df|grep '/dev/sdb.'|awk -F'[^0-9]*' '{print $5}')
#get folders
dir=($(ls -d /share/capture/*/))
while [[ ${per} -gt $limit ]]
do
for dirs in "${dir[@]}"; do
files=(*)
#get list of all pcap files in those folders
files=$((find $dirs -type f -name "*.pcap"))
len="${#files[@]}"
if [[ ${len} -gt $limit ]]
then
echo "${files[@]:0:10}"
rm -f "${files[@]:0:10}" #delete 10 files
fi
done
#Update per
done
echo $per
文件按最旧的顺序排列在数组顶部。另外,有关如何通过中断而不是轮询运行脚本的任何建议,即每次将文件添加到捕获中的任何文件夹时,我都想运行该脚本。
我已将脚本修改为以下内容:
#!/bin/bash
limit=8
file_limit=10
per=$(df|grep '/dev/sdb.'|awk -F'[^0-9]*' '{print $5}')
dir=($(ls -d /share/capture/*/))
while [[ ${per} -gt $limit ]]
do
for dirs in "${dir[@]}"; do
files=(*)
files=($(find $dirs -type f -name "*.pcap"))
len="${#files[@]}"
if [[ ${len} -gt $file_limit ]]
then
echo "${files[@]:0:10}"
rm -f "${files[@]:0:10}"
fi
done
done
echo $per
错误已解决,但脚本倾向于删除所有文件,而不是仅仅删除足够的文件以使使用百分比降至限制。我还是做错了什么吗?
答案1
回答问题的第二部分,监视文件系统更改的“最佳”方法是使用inotify(7)
.
有一组实用程序可以挂接到内核接口,inotify 工具。特别是,你想要inotify等待从该组实用程序中:
inotifywait 使用 Linux 的 inotify(7) 接口有效地等待文件更改。它适合等待 shell 脚本对文件的更改。它可以在事件发生后退出,也可以在事件发生时持续执行和输出事件。
你可以这样使用它:
#!/bin/sh
while inotifywait -e create /share/capture/*/; do
/share/capture/per.sh
done
只有在创建新文件时才会调用您的脚本。我做到了不是测试示例 - 我根据手册页对其进行了修改,因此请根据需要进行修改。