我正在尝试制作一个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
错误已解决,但是脚本倾向于删除所有文件,而不仅仅是删除足以使使用百分比降低到极限的文件。我还在做错什么吗?
回答问题的第二部分,监视文件系统更改的“最佳”方法是使用inotify(7)
。
有一组可以挂接到内核接口的实用程序inotify-tools。特别是,您希望从该组实用程序进行inotifywait:
inotifywait使用Linux的inotify(7)接口有效地等待文件的更改。它适合等待shell脚本中的文件更改。它既可以在事件发生后退出,也可以在事件发生时连续执行和输出。
您可以这样使用它:
#!/bin/sh
while inotifywait -e create /share/capture/*/; do
/share/capture/per.sh
done
只有在创建新文件时才会调用您的脚本。我并没有测试的例子-我适应它的手册页,所以请适应需要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句