Bash-Skript funktioniert nicht mit Crontab

Bash-Skript funktioniert nicht mit Crontab

Ich besitze einen Raspberry Pi, auf dem Raspbian Jessie läuft. Ich verwende diesen Raspberry mit Motioneye als Systemüberwachung. Motioneye zeichnet Dateien auf einer SD-Karte auf, aber ich möchte ältere Dateien im Ordner /var/lib/motioneye löschen, wenn die Festplatte voll ist. Motioneye zeichnet Filmdateien in /var/lib/motioneye mit Unterverzeichnissen für jeden Tag auf, z. B. /var/lib/motioneye/2016-02-13/files_in_order. Motioneye zeichnet Dateien mit dieser Berechtigung auf: drwxr-xr-x 2 root root 4096 13. Februar 17:03 13.02.2016, daher kann ich keine Dateien mit Benutzerzugriff löschen, ich muss Root sein. Ich kann das Skript problemlos ausführen mit

sudo bash ./deleteoldfiles.sh

aber wenn ich es in crontab eingebe, funktioniert das Skript nicht. Ich habe versucht, Pfade einzugeben, aber ohne Erfolg. Ich habe dieses Skript im Internet gefunden, ein wenig modifiziert, sodass es Ordner akzeptieren kann, anstatt Treiber zu mounten, und ich habe in das Skript einen Ordnerlink und die maximale Nutzung geschrieben. Mein Skript sieht so aus:

#!/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

Ich habe in sudo crontab -e Folgendes eingegeben:

#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

Entschuldigen Sie den langen Beitrag. Ich habe versucht zu erklären, was passiert, vielleicht bekomme ich Hilfe. Danke!

Antwort1

Ich habe es geschafft! Ich habe alles in sudo crontab -e gelöscht und in crontab -e nur diese Zeile eingegeben

* * * * * sudo bash -x /home/pi/deleteoldfiles.sh > /home/pi/output.txt 2>&1

und es funktioniert, ich habe eine Protokolldatei, mit der ich verfolgen kann, ob es gut funktioniert. Vielen Dank euch allen!

Antwort2

Gutes Skript, aber Sie sollten diese beiden Zeilen danach hinzufügen ((CYCLES++)):

OLDEST_FILE=""
OLDEST_DATE=0

, um die neue älteste Datei zu löschen.

verwandte Informationen