Сценарий запускается из командной строки, но crontab не работает - PullRequest
1 голос
/ 12 июля 2011

Я все еще изучаю 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

, и система печатает:

Ответы [ 3 ]

2 голосов
/ 13 июля 2011

Ваш сценарий предполагает, что он запускается из определенного каталога (обратите внимание, что почти каждый путь является относительным, а не абсолютным).cron случайно запускает его из другого каталога.

Исправление

Если скрипт работает, когда вы запускаете его из каталога, в котором он находится, добавьте следующее в начало вашего скрипта:

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

Объяснение

$0 - это (возможно, относительное) имя файла исполняемого скрипта оболочки.Для заданного имени файла команда dirname возвращает каталог, содержащий имя файла.

Таким образом, эта строка изменяет каталоги на каталог, содержащий скрипт, или завершает работу с кодом ошибки, если произойдет сбой либо dirname, либо cd.

0 голосов
/ 12 июля 2011

Похоже, вы предполагаете определенный начальный каталог и создаете каталог tmp там.Но когда вы запускаете его как задание cron, оно начинается в другом месте.Таким образом, команда CD в вашем скрипте запуска bash может вас испортить.Вы можете легко проверить, используя полные пути, когда вы cd или rm или что-то еще.

Например,

if [ -e "tmp/$AYER.lnum" ]; then
    rm /home/username/tmp/${AYER}.*
fi

# Si existe el archivo con el numero de laultima linea se procesa

if [ -e "/home/username/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 > "/home/username/tmp/$FECHA.hal"
    done < "/home/username/tmp/$FECHA.lnum"
    cd /home/username/tmp

    grep -n " 00[0|2-9][0-9]\{4,\}" "/home/username/tmp/$FECHA.hal" > "/home/username/tmp/${FECHA}.new"

и т. Д.

0 голосов
/ 12 июля 2011

Похоже, вам может понадобиться cd в правильном каталоге в начале вашего скрипта.

Поставьте pwd в начале, затем exit и посмотрите вывод cron, чтобы увидетьоткуда вы выполняетеТакже есть шанс, что у вас будет короче PATH при работе под cron, но он все равно должен иметь доступ к tail и grep.

...