【问题标题】:Shell script not working with crontabShell 脚本不适用于 crontab
【发布时间】:2017-03-11 08:53:02
【问题描述】:

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

【问题讨论】:

    标签: linux shell crontab


    【解决方案1】:

    将此行添加到您的脚本中:

    #!/bin/bash
    
    执行 > $MOUNTLOG/$datum.log 2>&1
    
    datum=$(date -I)

    如果有来自 shell 的错误消息或执行的命令之一,它将显示在日志文件中。

    【讨论】:

    • 我也添加了这一行,并将作业安排为从现在开始运行一分钟。谢谢
    【解决方案2】:

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

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

    【讨论】:

    • 我编辑了 crontab 作业。如果它在星期一工作,我会发布。感谢您的快速响应。
    • 不幸的是,我不知道如何在计划之前测试 cronjob。
    • 从现在开始两分钟后安排。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-04-15
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2014-11-05
      • 2015-11-13
      相关资源
      最近更新 更多