[英]Shell script not working with 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 --------
0 2 * * * sh /mnt/local/TempDrive/Software_RC/cleanOld.sh
並檢查文件權限和文件所有者
將此行添加到您的腳本:
#!/bin/bash exec > $MOUNTLOG/$datum.log 2>&1 datum=$(date -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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.