[英]Debian bash script works fine from command line; fails in crontab
我正在嘗試使用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中使用時管道不起作用(或有一些注意事項?)?
當crond
代表用戶運行腳本時,腳本將不具有用戶從命令行獲得的相同環境變量。 腳本經常會失敗。 這些是像PATH
和LD_LIBRARY_PATH
這樣的變量,依此類推。
將腳本文件中的行添加到腳本中,以使其獲取您的登錄腳本: /etc/profile
以及其他任何腳本。
創建此crontab
條目:
* * * * * set > /tmp/mycronenv.txt
將更改保存到crontab
。 等一兩分鍾。 回去擺脫那個條目。 最后:
set > myenv.txt
diff myenv.txt /tmp/mycronenv.txt
這將告訴你我的意思。 如何糾正它取決於你。 兩個輸出必須相同才能運行腳本。
因為$ ip_addr和$ old_ip_addr在從cron運行時結束時都是空白,或許打開xtrace然后檢查cron調用的結果輸出可以給你關於什么不起作用的線索。
把
set -x
在ip_addr =行之前應該做的伎倆。 然后讓cron運行,你應該在生成的電子郵件中獲得一堆輸出(或者你可以將輸出重定向為另一個用戶提到的。記住xtrace發送到stderr,所以使用像
* * * * * script >/tmp/outputfile 2>&1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.