gpt4 book ai didi

bash - 该脚本从命令行运行但 crontab 失败

转载 作者:行者123 更新时间:2023-12-04 06:20:19 25 4
gpt4 key购买 nike

我仍在学习 Bash,但我的脚本有问题。我想用这个分析通话记录的脚本过滤一些通话,每 2 分钟作为 cronjob。问题是我可以手动运行它,但是从 cron 自动运行时它会失败。我不知道为什么。它对权限大喊大叫,所以我对脚本进行了修补,所以如果它看起来很脏,我很抱歉。

#!/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碰巧从另一个目录运行它。

修复

如果在您从其所在目录运行该脚本时该脚本有效,请将以下内容添加到您的脚本顶部:

mydir=$(dirname "$0") && cd "${mydir}" || exit 1

解释
$0是正在执行的 shell 脚本的(可能是相对的)文件名。给定文件名, dirname命令返回包含文件名的目录。

因此,如果 dirname,该行将目录更改为包含脚本的目录或退出并显示错误代码或 cd失败。

关于bash - 该脚本从命令行运行但 crontab 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6668588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com