El script Bash no funciona con crontab

El script Bash no funciona con crontab

Tengo una raspberry pi que ejecuta raspbian jessie. Estoy usando esta frambuesa con motioneye como sistema de vigilancia. Motioneye graba archivos en una tarjeta SD, pero quiero eliminar archivos más antiguos en la carpeta /var/lib/motioneye cuando el uso del disco esté llegando al máximo. Motioneye graba archivos de películas en /var/lib/motioneye con subdirectorios para cada día como /var/lib/motioneye/2016-02-13/files_in_order. Motioneye graba archivos con este permiso drwxr-xr-x 2 root root 4096 13 de febrero 17:03 2016-02-13, por lo que no puedo eliminar archivos con acceso de usuario, necesito estar en root. Puedo ejecutar el script sin problemas con

sudo bash ./deleteoldfiles.sh

pero cuando lo ingreso en crontab, el script no funciona, intenté ingresar rutas sin éxito. Encontré este script en Internet, lo modifiqué un poco para que pueda aceptar carpetas en lugar de montar controladores y escribí en el enlace de la carpeta del script y el uso máximo. Mi script se ve así:

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

Entré en sudo crontab -e esto:

#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

Perdón por la publicación larga, traté de explicar lo que está pasando, tal vez obtenga algo de ayuda. Gracias !

Respuesta1

Lo hice ! Borré todo en sudo crontab -e y entré en crontab -e solo esta línea

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

y está funcionando, tengo un archivo de registro que puedo rastrear si funciona bien. Gracias a todos !

Respuesta2

Buen guión, pero deberías agregar estas dos líneas después ((CYCLES++)):

OLDEST_FILE=""
OLDEST_DATE=0

para eliminar el nuevo archivo más antiguo.

información relacionada