该脚本从命令行运行,但 crontab 失败 [英] The script runs from command line but crontab fails

查看:32
本文介绍了该脚本从命令行运行,但 crontab 失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我仍在学习 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.

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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆