Сценарий оболочки не работает правильно на crontab, работает при вызове вручную - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть скрипт в sh под Solaris 5.8, который работает не так, как ожидалось, и не знаю почему ...

Скрипт читает список URL-адресов из файла, тестирует ихс помощью curl и записывает вывод в файл журнала:

#!/bin/sh

# Logs path
LOG_DIR=/somedir/logs

# URLs file path
URL_FILE=/somedir/url

# Actual date
DATE=`date +%Y%m%d%H%M`

# CURL
CURL=/somedir/bin/curl

test_url()
{
    cat $URL_FILE | grep -i $1 | while read line
    do
        NAME=`echo $line | awk '{ print $1 }'`
        URL=`echo $line | awk '{ print $2 }'`
        TIME=`$CURL -s -o /dev/null -w %{time_total} $URL`
        echo "$DATE $TIME" >> $LOG_DIR/${NAME}_${1}.log
    done
}

test_url someurl
test_url someotherurl

URL_FILE имеет такой макет:

somename1 http://someurl/test
somename2 http://someotherurl/test

Сценарий загружает URL-адреса из файла и затем использует curl для полученияобщее время загрузки URL-адреса, затем печатает дату и время (в мс).Проблема, которую я обнаружил, состоит в том, что переменная TIME не работает при вызове внутри crontab, но работает при вызове самого пользователя:

# Output when called with the user ./script.sh
201202201018 0.035
# Output when called from crontab.
201202201019

Если я перенаправлю весь вывод * * * * * /path/to/script/script.sh 1&2 > /tmp/output,Выходной файл пуст.

Также я не смог увидеть какие-либо выходные данные в / var / log / syslog.Любая подсказка, почему переменная TIME не отображается правильно при вызове через crontab?

1 Ответ

5 голосов
/ 26 февраля 2012

Вещи, которые вы должны проверить:

  1. Действителен ли /path/to/script/script.sh 1&2 > /tmp/output в вашем кроне? На моей машине он запускал скрипт с аргументом «1» и пытался найти программу с именем «2» для его запуска. Не найдя его, он создает пустой выходной файл. Я думаю, что вы ищете что-то вроде /path/to/script/script.sh >> /tmp/output 2>&1
  2. Вы устанавливаете CURL на полный путь скручивания? Cron обычно не имеет такой же информации о пути, как у вас.
  3. Каким пользователем вы пользуетесь для запуска cron? Могут ли быть ограничения доступа к curl или сети?
  4. % действительно обрабатывается cron по-разному, если он записан в crontab. Это означает перевод строки, и в противном случае его следует экранировать. Вы проводили тесты с curl прямо в cron? Пока вы держите это в своем скрипте, у вас все будет хорошо.
...