Debian bash脚本在命令行中运行良好;在crontab中失败

时间:2013-02-21 00:50:37

标签: linux bash scripting io-redirection piping

我正在尝试使用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中使用时管道不起作用(或有一些警告?)

2 个答案:

答案 0 :(得分:3)

crond代表用户运行脚本时,脚本将不具有用户从命令行获得的相同环境变量。脚本经常会失败。这些变量包括PATHLD_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