Bash 스크립트가 crontab에서 작동하지 않습니다

Bash 스크립트가 crontab에서 작동하지 않습니다

저는 raspbian jessie를 실행하는 라즈베리 파이를 소유하고 있습니다. 시스템 모니터링을 위해 Motioneye와 함께 Raspberry Pi를 사용합니다. Motioneye는 SD 카드에 파일을 기록하는데, 디스크 사용량이 가득 차면 /var/lib/motioneye 폴더에 있는 오래된 파일을 삭제하고 싶습니다. Motioneye는 /var/lib/motioneye에 동영상 파일을 기록하고 /var/lib/motioneye/2016-02-13/files_in_order와 같은 매일 하위 디렉터리를 포함합니다. 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

가장 오래된 새 파일을 삭제합니다.

관련 정보