
ディスク使用量が制限に達すると、ファイルを削除し続ける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
質問の2番目の部分に答えるために、ファイルシステムの変更を監視するための「最も良い」方法はinotify(7)
。
カーネルインターフェイスに接続する一連のユーティリティがあります。イノティファイツール。特にあなたが望むinotify待つこのユーティリティセットでは:
inotifywait は、Linux の inotify(7) インタフェースを使用してファイルの変更を効果的に待ちます。シェルスクリプトでファイルの変更を待つのに適しています。イベントが発生した後に終了することも、イベントが発生している間もイベントを実行して出力することもできます。
次のように使用できます。
#!/bin/sh
while inotifywait -e create /share/capture/*/; do
/share/capture/per.sh
done
新しいファイルが生成されたときにのみスクリプトが呼び出されます。私がやったいいえテスト例 - マンページを基準に修正しましたので、必要に応じて修正してください。