O script Bash não funciona com o crontab

O script Bash não funciona com o crontab

Eu possuo um Raspberry Pi que roda Jessie Raspbian. Estou usando este framboesa com motioneye como sistema de vigilância. Motioneye grava arquivos em um cartão SD, mas quero excluir arquivos mais antigos na pasta /var/lib/motioneye quando o uso do disco estiver cheio. Motioneye grava arquivos de filme em /var/lib/motioneye com subdiretórios para cada dia, como /var/lib/motioneye/2016-02-13/files_in_order. Motioneye grava arquivos com esta permissão drwxr-xr-x 2 root root 4096 13 de fevereiro 17:03 2016-02-13 então não posso excluir arquivos com acesso de usuário, preciso estar no root. Posso executar o script sem problemas com

sudo bash ./deleteoldfiles.sh

mas quando entro no crontab o script não funciona, tentei inserir caminhos sem sucesso. Encontrei esse script na internet, modifiquei um pouco para aceitar pastas em vez de montar drivers e escrevi no script link da pasta e uso máximo. Meu script fica assim:

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

Entrei no sudo crontab -e isto:

#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

Desculpe pela postagem longa, tentei explicar o que está acontecendo, talvez consiga ajuda. Obrigado !

Responder1

Eu fiz isso ! apaguei tudo no sudo crontab -e e entrei no crontab -e apenas esta linha

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

e está funcionando, tenho um arquivo de log que posso rastrear se estiver funcionando bem. Obrigado a todos!

Responder2

Bom script, mas você deve adicionar estas duas linhas depois ((CYCLES++)):

OLDEST_FILE=""
OLDEST_DATE=0

para excluir o novo arquivo mais antigo.

informação relacionada