0

I own a raspberry pi that runs raspbian jessie. I'm using this raspberry with motioneye as a system surveillance. Motioneye records files to a sd card but i want to delete older files in folder /var/lib/motioneye when disk usage is coming full. Motioneye records movie files in /var/lib/motioneye with subdirectories for each day like /var/lib/motioneye/2016-02-13/files_in_order. Motioneye records files with this permission drwxr-xr-x 2 root root 4096 Feb 13 17:03 2016-02-13 so i can't delete files with user access, i need to be in root. I can run the script with no problems with

sudo bash ./deleteoldfiles.sh

but when i enter it in crontab the script is not working, i tried entering paths with no success. I found this script on internet, modified a little so it can accept folders instead of mounting drivers and i wrote in script folder link and max usage. My script looks like this:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/pi/
############################################################################### 
# Author            :  Louwrentius
# Contact           : louwrentius@gmail.com
# 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

I entered in sudo crontab -e this:

#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

Sorry for long post, I tried to explain what`s happening maybe i get some help. Thank you !

  • Do you get any error message? Try to run as bash -x /home/pi/deleteoldfiles.sh &>/tmp/output to see what is going on. – michas Feb 13 '16 at 18:21
  • i modified the sudo crontab -e with #Borrowed from anacron SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin #End borrowed from anacron # */5 * * * * /home/pi/deleteoldfiles.sh * * * * * bash -x /home/pi/deleteoldfiles.sh &>/tmp/output but in tmp/output all i can see is a blank file. – Andrei Feb 13 '16 at 18:29
  • In this case you can probably simplify your question a lot. Try to replace your long script with a simple one only doing something like date >/tmp/time. This should work manually but not in cron. – michas Feb 13 '16 at 18:53
  • add the line 'MAILTO=someone@somewhere' to the crontab file to get the output of all executed commands. This will give you a hint about whats happening. – gerhard d. Feb 13 '16 at 19:02
  • 1
    Is the script's execute bit set? i.e. can you run it manually as ./deleteoldfiles.sh rather than bash ./deleteoldfiles.sh? – steeldriver Feb 13 '16 at 19:03
0

Fine script, but you should add these two lines after ((CYCLES++)):

OLDEST_FILE=""
OLDEST_DATE=0

to delete the new oldest file.

-1

I did it ! i erased all in sudo crontab -e and entered in crontab -e only this line

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

and it's working, i have a log file which i can track if it`s working good. Thank you all !

  • 1
    And why is that working? – Nils Feb 13 '16 at 20:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.