该脚本从命令行运行,但 crontab 失败 [英] The script runs from command line but crontab fails
问题描述
我仍在学习 Bash,但我的脚本有问题.我想用这个脚本来过滤一些呼叫,该脚本正在分析呼叫日志,每 2 分钟作为 cronjob.问题是我可以手动运行它,但是从 cron 自动运行时它会失败.我不知道为什么.它对权限大喊大叫,所以我对脚本进行了修补,所以如果它看起来很脏,我很抱歉.
I'm still learning Bash and I'm having a problem with my script. I want to filter some calls with this script that is analyzing a call log, every 2 minutes as cronjob. The problem is that I can run it manually but it fails when run automatically from cron. I don't know why. It shouts something about permissions, so I kinda patched the script, so if it seems dirty I'm sorry.
#!/bin/bash
YESTERDAY=$((`date +'%s'`-86400))
AYER=`date -d "1970-01-01 $YESTERDAY sec" +"%Y%m%d"`
FECHA=`date +"%Y%m%d"`
FILENAME="$FECHA.log"
FILE_LINE="$FECHA.last"
FILE="/apps/sittel/rawdata/mitel.$FECHA"
# Limpiar carpeta tmp
if [ -e "tmp/$AYER.lnum" ]; then
rm tmp/${AYER}.*
fi
# Si existe el archivo con el numero de laultima linea se procesa
if [ -e "tmp/$FECHA.lnum" ]; then
# Se lee el numero de la linea y se extrae un archivo con las lineas apartir
# de la ultima busqueda que se hizo, posteriormente se les hace un grep
while read line
do
tail -n +$line $FILE > "tmp/$FECHA.hal"
done < "tmp/$FECHA.lnum"
cd tmp
grep -n " 00[0|2-9][0-9]{4,}" "tmp/$FECHA.hal" > "tmp/${FECHA}.new"
grep -n " 900[0|2-9][0-9]{4,}" "tmp/$FECHA.hal" >> "tmp/${FECHA}.new"
cd ..
echo `pwd`
cat tmp/${FECHA}.new >> logs/$FILENAME
else
# Este caso es la primera vez que se ejecuta, verifica si el log ya existe
# de ser asi, lo elimina para evitar duplicados
if [ -e "logs/$FILENAME" ]; then
rm "logs/$FILENAME"
fi
# Se realiza un grep en el archivo indicado y se marca el archivo de salida
# se busca todos los numeros k empiecen con 00 seguidos de 0 a 9 execpto el 1
cd tmp
grep -n " 00[0|2-9][0-9]{4,}" $FILE>"${FECHA}.new"
grep -n " 900[0|2-9][0-9]{4,}" $FILE>>"${FECHA}.new"
cat ${FECHA}.new >> $FILENAME
mv $FILENAME ../logs
cd ..
fi
cp "tmp/${FECHA}.new" "tmp/message.txt"
echo "Mensaje" | mail -s "$SUBJECT" "$EMAIL" < "tmp/message.txt"
fi
if [ -e "tmp/${FECHA}.new" ]; then
rm "tmp/${FECHA}.new"
fi
tail -n1 "logs/$FILENAME" > "tmp/$FILE_LINE"
IFS=$':'
while read line
do
DATOS=($line)
LINE_NUMBER=${DATOS[0]}
echo $LINE_NUMBER > "tmp/$FECHA.lnum"
done < "tmp/$FILE_LINE"
unset IFS
这是系统打印的内容:
/apps/sittel/Alarma/callAlarm: line 56: cd: tmp: No such file or directory
mv: cannot move `20110712.log' to `../logs': Permission denied
/apps/sittel/Alarma/callAlarm: line 69: tmp/20110712.last: No such file or directory
/apps/sittel/Alarma/callAlarm: line 77: tmp/20110712.last: No such file or directory
推荐答案
您的脚本假定它是从特定目录运行的(请注意,几乎每个路径都是相对路径,而不是绝对路径).cron
恰好从另一个目录运行它.
Your script assumes that it is being run from a particular directory (note that almost every path is a relative path, not an absolute path). cron
happens to be running it from another directory.
如果脚本在您从其所在目录运行时可以正常工作,请将以下内容添加到您的脚本顶部:
If the script works when you run it from the directory it lives in, add the following to the top of your script:
mydir=$(dirname "$0") && cd "${mydir}" || exit 1
说明
$0
是正在执行的 shell 脚本的(可能是相对的)文件名.给定文件名,dirname
命令返回包含文件名的目录.
Explanation
$0
is the (possibly relative) filename of the shell script being executed. Given a filename, the dirname
command returns the directory containing the filename.
因此,如果 dirname
或 cd
失败,该行将目录更改为包含脚本的目录或退出并显示错误代码.
So, that line changes directories to the directory containing the script or exits with an error code if either dirname
or cd
fails.
这篇关于该脚本从命令行运行,但 crontab 失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!