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代わってスクリプトを実行すると、スクリプトには、ユーザーがコマンドラインから持っていたのと同じ環境変数はありません。スクリプトはしばしば失敗します。これらはPATHやなどLD_LIBRARY_PATHの変数です。

スクリプト ファイルにスクリプトに行を追加して、ログオン スクリプトをソースにします:/etc/profileとその他のスクリプト。

crontabこのエントリを作成します。

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

に変更を保存しますcrontab。1、2 分待ってください。戻って、そのエントリを削除します。ついに:

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

これは私が何を意味するかを示します。どのように修正するかはあなた次第です。スクリプトを実行するには、2 つの出力が同一である必要があります。

于 2013-02-21T01:14:31.357 に答える
1

cron から実行すると $ip_addr と $old_ip_addr の両方が空白になるため、おそらく xtrace をオンにして、cron 呼び出しからの結果の出力を調べると、何が機能していないかの手がかりが得られる可能性があります。

パッティング

set -x

ip_addr= 行の前にトリックを行う必要があります。次にcronを実行すると、結果の電子メールに一連の出力が表示されるはずです(または、別のユーザーが言及したように出力をリダイレクトできます.xtraceがstderrに出力されることに注意してください。次のようなものを使用してください

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