2017-03-11 3 views
1

名前に「RC」が付いているディレクトリとサブディレクトリをすべてスキャンし、40日以上経過したものはすべて削除しますが、40日以上経過しても必ず最後のものを残すスクリプトがあります。シェルスクリプトがcrontabと連携していない

私が心配している問題は、私が手でスクリプトを実行すると、それが正常に動作することです。./cronJob.shしかし、私がcrontabリストに置くと、ディレクトリは削除されませんが、ログには2行しか出力されません。

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

ログ出力

[[email protected] softwareRC]# cat 2017-03-11.log 
-------- START -------- 
-------- END -------- 

答えて

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) 

:後

oldest=$($FIND -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 
1

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

そしてファイルをチェックファイルの許可と所有者

+0

私はcrontabジョブを編集しました。 月曜日に仕事をしたら投稿します。 ありがとうございました。 –

+0

は今働いていますか? –

+0

不幸にも私はcronjobが予定される前にそれをテストする方法を知らない。 –

1

スクリプトに次の行を追加します。

#!/bin/bash 

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

datum=$(date -I)

をシェルや実行のいずれかのコマンドからのエラーメッセージがある場合は、ログファイルに表示されます。

+0

私はこの行も追加し、今から1分後にジョブを実行するようにスケジュールしました。ありがとうございました –

関連する問題