Скрипт оболочки не работает с crontab

У меня есть скрипт, который сканирует все каталоги и подкаталоги для тех, кто имеет "RC" в названии, и удаляет все старше 40 дней, но всегда оставляет последний, даже если он старше 40 дней.

Проблема, которую я поднимаю, заключается в том, что если я запускаю скрипт вручную ./cronJob.sh работает как надо. Но когда я помещаю его в список crontab, он не удаляет каталоги, а выводит только две строки в журнале.

#!/bin/bash

datum=$(date -I)
MOUNTLOG=/var/log/softwareRC/

FIND=/bin/find;

deleteDir(){
    echo "-------- START $parent --------" >> $MOUNTLOG/$datum.log
    dname=$(/usr/bin/dirname $1)
    temp="${dname%\s.*}"
    temp=(${temp[@]})
    parent="${temp[0]}"
    dirNum="$($FIND $parent -maxdepth 1 -name *RC* -type d -print | wc -l)"
    najnovejsi="$($FIND $parent -maxdepth 1 -name *RC* -type d -print | sort | tail -n 1)"
    if [ $dirNum -gt 1 ]; then
            $FIND "$parent" -path "$najnovejsi" -prune -o -name *RC* -mtime +40 -print -exec rm -r "{}" \; >> $MOUNTLOG/$datum.log
    fi;
    echo "-------- END $parent --------" >> $MOUNTLOG/$datum.log
}

declare -i skipDir=1

while true
do
    oldest=$($FIND -type d -name *RC* -mtime +40 -printf '%T+ %p\n' | sort -r | tail -n $skipDir | head -n 1)
#       echo najstarejsi $oldest
    dironly=$(echo $oldest | cut -d' ' -f 2-)
    deleteDir "$dironly"

#       echo $skipDir $dironly
    /bin/sleep 1
    if [ "$dironly" = "$testna" ]; then
            break
    else
            testna=$(echo $oldest | cut -d' ' -f 2-)
            let "skipDir++"
    fi;
#       echo primerjava $testna
done

Crontab работа

0 2 * * * /mnt/local/TempDrive/Software_RC/.cleanOld.sh

Выход журнала

[root@SambaServer softwareRC]# cat 2017-03-11.log
-------- START  --------
-------- END  --------

3 ответа

Решение

Большое спасибо за вашу помощь и извините за поздний ответ. Я понял, что было не так.

Проблема была в строке ниже. Мне пришлось ввести весь путь к месту, откуда запускается скрипт.

До:

oldest=$($FIND -type d -name *RC* -mtime +40 -printf '%T+ %p\n' | sort -r | tail -n $skipDir | head -n 1)

После:

oldest=$($FIND /mnt/local/TempDrive/Software_RC -type d -name *RC* -mtime +40 -printf '%T+ %p\n' | sort -r | tail -n $skipDir | head -n 1)

Это рабочий код.

#!/bin/bash

datum=$(date -I)
MOUNTLOG=/var/log/softwareRC/

exec > $MOUNTLOG/$datum.log 2>&1

FIND=/bin/find;

deleteDir(){
    echo "-------- START $parent --------" >> $MOUNTLOG/$datum.log
    dname=$(/usr/bin/dirname $1)
    temp="${dname%\s.*}"
    temp=(${temp[@]})
    parent="${temp[0]}"
    dirNum="$($FIND $parent -maxdepth 1 -name *RC* -type d -print | wc -l)"
    najnovejsi="$($FIND $parent -maxdepth 1 -name *RC* -type d -print | sort | tail -n 1)"
    if [ $dirNum -gt 1 ]; then
            $FIND "$parent" -path "$najnovejsi" -prune -o -name *RC* -mtime +40 -print -exec rm -r "{}" \; >> $MOUNTLOG/$datum.log
    fi;
    echo "-------- END $parent --------" >> $MOUNTLOG/$datum.log
}

declare -i skipDir=1

while true
do
    oldest=$($FIND /mnt/local/TempDrive/Software_RC -type d -name *RC* -mtime +40 -printf '%T+ %p\n' | sort -r | tail -n $skipDir | head -n 1)
    dironly=$(echo $oldest | cut -d' ' -f 2-)
    deleteDir "$dironly"

    /bin/sleep 1
    if [ "$dironly" = "$testna" ]; then
            break
    else
            testna=$(echo $oldest | cut -d' ' -f 2-)
            let "skipDir++"
    fi;
done

0 2 * * * sh /mnt/local/TempDrive/Software_RC/cleanOld.sh

И проверьте разрешение файла и владельца файла

Добавьте эту строку в ваш скрипт:

#! / Bin/ Башexec > $MOUNTLOG/$datum.log 2>&1 дата =$(дата -I)

Если имеется сообщение об ошибке из оболочки или одной из выполненных команд, оно будет отображено в файле журнала.

Другие вопросы по тегам