Linux Shell脚本不使用crontab

Linux Shell脚本不使用crontab,linux,shell,crontab,Linux,Shell,Crontab,我有一个脚本,可以扫描所有目录和子目录,查找名字中有“RC”的目录和子目录,删除所有超过40天的目录和子目录,但始终保留最后一个目录和子目录,即使它超过40天 我遇到的问题是,如果我手动运行脚本/cronJob.sh,它就会正常工作。但当我把它放在crontab列表上时,它不会删除目录,而是只在日志中输出两行 #!/bin/bash datum=$(date -I) MOUNTLOG=/var/log/softwareRC/ FIND=/bin/find; deleteDir(){

我有一个脚本,可以扫描所有目录和子目录,查找名字中有“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  --------

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


并检查文件权限和文件所有者

将此行添加到脚本中:

#!/bin/bash exec > $MOUNTLOG/$datum.log 2>&1 datum=$(date -I) #!/bin/bash exec>$MOUNTLOG/$datum.log 2>&1 数据=$(日期-I)
如果shell或某个已执行命令发出错误消息,它将显示在日志文件中。

非常感谢您的帮助,很抱歉回复太晚。我已经找出了问题所在

问题在下面一行。我必须输入脚本运行位置的整个路径

之前:

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

我编辑了crontab作业。我会张贴,如果它在周一工作。感谢您的快速响应。不幸的是,我不知道如何在计划cronjob之前对其进行测试。请在两分钟后将其计划为从现在开始。我还添加了此行,并将作业计划为从现在开始运行一分钟。非常感谢。