Скрипт 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
Это покажет вам, что я имею в виду. Как исправить это зависит от вас. Два сценария должны быть идентичны для запуска вашего сценария.