1

我正在尝试使用 DreamHost API(请参阅此处)使用 crontab 更新 DNS 条目。我编写了以下 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

因此,当脚本由 crontab 运行时,脚本似乎没有 ip_addr 和 old_ip_addr 变量(这当然意味着更新永远不会发生)。知道为什么吗?在 crontab 中使用时,管道是否不起作用(或有一些警告?)?

4

2 回答 2

3

crond代表用户运行脚本时,该脚本将不会具有用户从命令行获得的相同环境变量。脚本经常会失败。这些是变量,如PATHLD_LIBRARY_PATH,等等。

将脚本文件中的行添加到脚本中,以使其获取您的登录脚本:/etc/profile,以及任何其他脚本。

创建此条crontab目:

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

将更改保存到crontab. 等一两分钟。返回并摆脱该条目。最后:

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

这会告诉你我的意思。如何纠正它取决于你。两个输出必须相同,您的脚本才能运行。

于 2013-02-21T01:14:31.357 回答
1

因为 $ip_addr 和 $old_ip_addr 在从 cron 运行时最终都是空白的,所以也许打开 xtrace 然后检查 cron 调用的结果输出可以为您提供有关什么不工作的线索。

推杆

set -x

在 ip_addr= 行之前应该可以解决问题。然后让 cron 运行,你应该在生成的电子邮件中得到一堆输出(或者你可以像另一个用户提到的那样重定向输出。记住 xtrace 会发送到 stderr,所以使用类似的东西

* * * * * script >/tmp/outputfile 2>&1
于 2013-02-21T03:23:03.133 回答