저는 raspbian jessie를 실행하는 라즈베리 파이를 소유하고 있습니다. 저는 이 라즈베리를 모션아이와 함께 시스템 감시용으로 사용하고 있습니다. Motioneye는 파일을 SD 카드에 기록하지만 디스크 사용량이 가득 차면 /var/lib/motioneye 폴더에서 오래된 파일을 삭제하고 싶습니다. Motioneye는 /var/lib/motioneye/2016-02-13/files_in_order와 같은 매일 하위 디렉터리를 사용하여 /var/lib/motioneye에 동영상 파일을 기록합니다. Motioneye는 이 권한으로 파일을 기록합니다. drwxr-xr-x 2 root root 4096 Feb 13 17:03 2016-02-13 따라서 사용자 액세스 권한이 있는 파일을 삭제할 수 없으므로 루트에 있어야 합니다. 문제없이 스크립트를 실행할 수 있습니다.
sudo bash ./deleteoldfiles.sh
하지만 crontab에 입력하면 스크립트가 작동하지 않고 경로 입력을 시도했지만 성공하지 못했습니다. 인터넷에서 이 스크립트를 찾았고 드라이버를 마운트하는 대신 폴더를 허용할 수 있도록 약간 수정했으며 스크립트 폴더 링크와 최대 사용량에 썼습니다. 내 스크립트는 다음과 같습니다
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/pi/
###############################################################################
# Author : Louwrentius
# Contact : [email protected]
# Initial release : August 2011
# Licence : Simplified BSD License
###############################################################################
VERSION=1.01
#
# Mounted volume to be monitored.
#
MOUNT="/var/lib/motioneye"
#
# Maximum threshold of volume used as an integer that represents a percentage:
# 95 = 95%.
#
MAX_USAGE="90"
#
# Failsafe mechansim. Delete a maxium of MAX_CYCLES files, raise an error after
# that. Prevents possible runaway script. Disable by choosing a high value.
#
MAX_CYCLES=10
show_header () {
echo
echo DELETE OLD FILES $VERSION
echo
}
show_header
reset () {
CYCLES=0
OLDEST_FILE=""
OLDEST_DATE=0
ARCH=`uname`
}
reset
if [ -z "$MOUNT" ] || [ ! -e "$MOUNT" ] || [ ! -d "$MOUNT" ] || [ -z "$MAX_USAGE" ]
then
echo "Usage: $0 <mountpoint> <threshold>"
echo "Where threshold is a percentage."
echo
echo "Example: $0 /storage 90"
echo "If disk usage of /storage exceeds 90% the oldest"
echo "file(s) will be deleted until usage is below 90%."
echo
echo "Wrong command line arguments or another error:"
echo
echo "- Directory not provided as argument or"
echo "- Directory does not exist or"
echo "- Argument is not a directory or"
echo "- no/wrong percentage supplied as argument."
echo
exit 1
fi
check_capacity () {
USAGE=`df -h "$MOUNT"| tail -1 | awk '{ print $5 }' | sed s/%//g`
if [ ! "$?" == "0" ]
then
echo "Error: mountpoint $MOUNT not found in df output."
exit 1
fi
if [ -z "$USAGE" ]
then
echo "Didn't get usage information of $MOUNT"
echo "Mountpoint does not exist or please remove trailing slash."
exit 1
fi
if [ "$USAGE" -gt "$MAX_USAGE" ]
then
echo "Usage of $USAGE% exceeded limit of $MAX_USAGE percent."
return 0
else
echo "Usage of $USAGE% is within limit of $MAX_USAGE percent."
return 1
fi
}
check_age () {
FILE="$1"
if [ "$ARCH" == "Linux" ]
then
FILE_DATE=`stat -c %Z "$FILE"`
elif [ "$ARCH" == "Darwin" ]
then
FILE_DATE=`stat -f %Sm -t %s "$FILE"`
else
echo "Error: unsupported architecture."
echo "Send a patch for the correct stat arguments for your architecture."
fi
NOW=`date +%s`
AGE=$((NOW-FILE_DATE))
if [ "$AGE" -gt "$OLDEST_DATE" ]
then
export OLDEST_DATE="$AGE"
export OLDEST_FILE="$FILE"
fi
}
process_file () {
FILE="$1"
#
# Replace the following commands with wathever you want to do with
# this file. You can delete files but also move files or do something else.
#
echo "Deleting oldest file $FILE"
rm -f "$FILE"
}
while check_capacity
do
if [ "$CYCLES" -gt "$MAX_CYCLES" ]
then
echo "Error: after $MAX_CYCLES deleted files still not enough free space."
exit 1
fi
FILES=`find "$MOUNT" -type f`
IFS=$'\n'
for x in $FILES
do
check_age "$x"
done
if [ -e "$OLDEST_FILE" ]
then
#
# Do something with file.
#
process_file "$OLDEST_FILE"
else
echo "Error: somehow, item $OLDEST_FILE disappeared."
fi
((CYCLES++))
done
echo
sudo crontab -e에 다음을 입력했습니다.
#Borrowed from anacron SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron
* * * * * /home/pi/deleteoldfiles.sh
글이 길어져서 죄송합니다. 무슨 일이 일어나고 있는지 설명하려고 노력했습니다. 어쩌면 도움이 필요할 수도 있습니다. 감사합니다 !
답변1
내가 해냈어! sudo crontab -e에서 모두 지우고 crontab -e에 이 줄만 입력했습니다.
* * * * * sudo bash -x /home/pi/deleteoldfiles.sh > /home/pi/output.txt 2>&1
잘 작동하는지 추적할 수 있는 로그 파일이 있습니다. 다들 감사 해요 !
답변2
훌륭한 스크립트입니다. 하지만 다음 두 줄을 뒤에 추가해야 합니다 ((CYCLES++))
.
OLDEST_FILE=""
OLDEST_DATE=0
가장 오래된 새 파일을 삭제하려면