更新时间:2022-10-18 11:16:56
您脚本假设它正在从一个特定的目录中运行(注意,几乎每一个路径是相对路径,而不是绝对路径)。 的cron
恰好从另一个目录中运行它。
如果脚本的工作,当你从它所处的目录中运行它,以下内容添加到你的脚本的顶部:
MYDIR = $(目录名称$ 0)及和放大器; CD$ {} MYDIR|| 1号出口
$ 1,0
是shell脚本执行的(可能是相对)的文件名。给定一个文件名,目录名
命令返回一个包含文件名的目录。
所以,该行改变包含脚本或退出目录,该目录有错误code如果目录名
或 CD
失败。
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
and this is what the system prints:
/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
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
is the (possibly relative) filename of the shell script being executed. Given a filename, the dirname
command returns the directory containing the filename.
So, that line changes directories to the directory containing the script or exits with an error code if either dirname
or cd
fails.