Скрипт Debian bash отлично работает из командной строки; терпит неудачу в crontab

Я пытаюсь использовать DreamHost API (см. Здесь) для обновления записи DNS с помощью crontab. Я написал следующий скрипт bash:

#!/bin/bash
dh_api_key=<my api key>
dh_domain=<my fq subdomain>

dh_url="https://api.dreamhost.com/?key=$dh_api_key&record=$dh_domain&type=A"

ip_addr=`ifconfig eth0 | grep "inet addr" | 
    grep -o "\([0-9]\{1,3\}\.\?\)\{4\}" | head -n 1`

old_ip_addr=`wget -q -O - ""$dh_url&cmd=dns-list_records"" | 
    grep $dh_domain | grep -o "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"`

dh_url="https://api.dreamhost.com/?key=$dh_api_key&record=$dh_domain&type=A"
dh_url_add="$dh_url&cmd=dns-add_record&value=$ip_addr"
dh_url_del="$dh_url&cmd=dns-remove_record&value=$old_ip_addr"

echo $ip_addr
echo $old_ip_addr

if [ "$ip_addr" == "$old_ip_addr" ]
then
    echo SAME
else
    echo DIFFERENT; UPDATING
    wget -q -O - "$dh_url_del"
    wget -q -O - "$dh_url_add"
fi

Моя запись в crontab выглядит так:

0,15,30,45 * * * * /home/<username>/dreamhost_api/dns_update_script > /home/<username>/dreamhost_api/dns_update_script.out # <-- note the redirection

Если я запускаю скрипт вручную, я получаю следующий вывод:

<old ip address>
<new ip address>
DIFFERENT; UPDATING

... и все обновляется как надо. Если я позволю crontab выполнить задание, обновление никогда не произойдет. Когда я смотрю на файл dns_update_script.out, я вижу:

<blank line>
<blank line>
SAME

Таким образом, сценарий, кажется, не имеет ничего для переменных ip_addr и old_ip_addr, когда сценарий запускается crontab (что, конечно, означает, что обновление никогда не происходит). Есть идеи почему? Не работает ли трубопровод (или есть некоторые предостережения?) При использовании в crontab?

2 ответа

Решение

Поскольку и $ip_addr, и $ old_ip_addr заканчиваются пустыми, когда он запускается из cron, возможно, включение xtrace и последующая проверка полученного результата вызова cron могут дать вам подсказку о том, что не работает.

сдачи

set -x

прежде чем строка ip_addr = должна сделать свое дело. затем запустите cron, и вы получите кучу выходных данных в получающемся электронном письме (или вы можете перенаправить вывод, как упомянул другой пользователь. Имейте в виду, что xtrace передает в stderr, так что используйте что-то вроде

* * * * * script >/tmp/outputfile 2>&1

Когда crond запускает сценарий от имени пользователя, сценарий НЕ будет иметь те же переменные окружения, которые пользователь имел из командной строки. Сценарий часто терпит неудачу. Это такие переменные, как PATH а также LD_LIBRARY_PATH, и так далее.

Добавьте строки в ваш файл сценария, чтобы он стал источником ваших сценариев входа в систему: /etc/profileплюс любые другие.

Создать это crontab запись:

* * * * *  set > /tmp/mycronenv.txt

Сохраните изменения в crontab, Подождите минуту или две. Вернитесь и избавьтесь от этой записи. В заключение:

set > myenv.txt
diff myenv.txt /tmp/mycronenv.txt

Это покажет вам, что я имею в виду. Как исправить это зависит от вас. Два сценария должны быть идентичны для запуска вашего сценария.

Другие вопросы по тегам