我正在尝试使用DreamHost API(请参阅here)使用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中使用时管道不起作用(或有一些警告?)
答案 0 :(得分:3)
当crond
代表用户运行脚本时,脚本将不具有用户从命令行获得的相同环境变量。脚本经常会失败。这些变量包括PATH
和LD_LIBRARY_PATH
等等。
在脚本文件中添加行到脚本,让它来源您的登录脚本:/etc/profile
,以及其他任何脚本。
创建此crontab
条目:
* * * * * set > /tmp/mycronenv.txt
将更改保存到crontab
。等一两分钟。回去摆脱那个条目。最后:
set > myenv.txt
diff myenv.txt /tmp/mycronenv.txt
这会告诉你我的意思。如何纠正它取决于你。两个输出必须相同才能运行脚本。
答案 1 :(得分:1)
因为$ ip_addr和$ old_ip_addr在从cron运行时结束时都是空白,可能打开xtrace然后检查cron调用的结果输出可能会给你关于什么不起作用的线索。
把
set -x
在ip_addr =行之前应该做的伎俩。然后让cron运行,你应该在生成的电子邮件中获得一堆输出(或者你可以将输出重定向为另一个用户提到的。记住xtrace发送到stderr,所以使用像
这样的东西* * * * * script >/tmp/outputfile 2>&1