디스크 사용량이 한계에 도달하면 파일을 계속 삭제하는 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기다려이 유틸리티 세트에서:
inotifywait는 Linux의 inotify(7) 인터페이스를 사용하여 파일 변경을 효과적으로 기다립니다. 쉘 스크립트에서 파일 변경을 기다리는 데 적합합니다. 이벤트가 발생한 후에 종료할 수도 있고, 이벤트가 발생하는 동안 계속해서 이벤트를 실행하고 출력할 수도 있습니다.
다음과 같이 사용할 수 있습니다.
#!/bin/sh
while inotifywait -e create /share/capture/*/; do
/share/capture/per.sh
done
새 파일이 생성될 때만 스크립트가 호출됩니다. 내가 해냈어아니요테스트 예시 - 맨페이지를 기준으로 수정하였으니 필요에 따라 수정해 주시기 바랍니다.