dポイントプレゼントキャンペーン実施中!

某サイトを参考にIPアドレスの自動アップデート スクリプトを作成しました。 OSはCentOS6.2です。

その後、crontab -e を実行(中は空で何も記入されていませんでした)しました。 本来vi /etc/crontab で編集するのかなと思ったのですが、以前使用していたvinelinuxのcrontabと表示形式が違っていたので、何も書き込んでいません。

crontab -e 実行後、下記内容を貼り付け保存しました。MAIL TO は空欄たったのですが、スクリプトが正常に実行されているかメールで受信したいため、下記設定をしました。すると確かにメールは10間隔で届くのですが、内容は下記エラーです。
エラー内容 /bin/bash: root: command not found

crontab 設定内容
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO={ローカルドメイン内のメールアドレス記載}
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

# DDNS
*/10 * * * * root perl /usr/ddns/ipchk.pl
00 5 * * 0 root rm -f /usr/ddns/CRT_IP.dat

スクリプトの内容は下記のとおりです。スクリプトの中にwgetコマンドがあるのですが、centos6.2ではwgetが最初から入っていました。念のためyum -y install wget を実行したところすでにインストール済みの表示が出ました。(command not found と言うエラーからwgetが実行されないのかな、と勝手に思った次第です)
#!/usr/local/bin/perl (which perl 実行結果 /usr/local/bin/perl と表示がでたのでそれに従いました)
#
$CRT_IPF = '/usr/ddns/CRT_IP.dat';
$NEW_IPF = '/usr/ddns/NEW_IP.dat';
$LOG = '/var/log/ddns.log';

open INPUT,"$CRT_IPF";
$CRT_IP=<INPUT>;
close INPUT;

system("/usr/local/bin/wget -q -O $NEW_IPF {ここには REMOTE_ADDR:の結果が取得できる登録済みDDNSのアドレス記入}");
open(INPUT,$NEW_IPF);
$c = <INPUT>;
$stp = index($c,"REMOTE_ADDR:")+12;
$edp = length($c);
$NEW_IP = substr($c,$stp,($edp-$stp));
close(INPUT);

if ($NEW_IP ne "" and $CRT_IP ne $NEW_IP) {
open (OUTPUT ,">$CRT_IPF");
print OUTPUT $NEW_IP;
close OUTPUT;

print "IP Address update: $CRT_IP to $NEW_IP\n";
system("/usr/bin/wget -q -O - '{DDNSのIP更新サイトのアドレス記載 &ドメイン&pw=パスワード}'");

$now_string = localtime;
open (OUTPUT ,">>$LOG");
print OUTPUT "$now_string DDNS IP Address Updated. $CRT_IP to $NEW_IP\n";
close OUTPUT;
}

何がいけないのでしょうか。よろしくお願いします。

A 回答 (4件)

>crontab -e でユーザフィールドは省いてコマンド入力しましたが、メールに帰ってくるエラーは同じでした。



/bin/bash: root: command not found
ですか??

>なぜかメールが届きません。rootのままで、届いていたのに、届かなくなりました。

標準出力に出ているモノが、そのままメールで通知される…かと思われますが、ちょっと謎ですね。
ウチで動いているのは…/etc/crontabに書き込んだものでpostfixも動かしていて…
内部のメールサーバへ配信されていますけどね。
# ただし、CentOS5.8とDebian 6.0ですが。

>例えば、DDNSの実行結果を/var/log/フォルダ内に適当なログを作り、そこに出力させるようコマンドの後などに付け足すことは出来るのでしょうか。

リダイレクトは可能でしょうから、ソレでファイルに落とす…とかでしょうかねぇ。
DDNSの更新はddclientを使うとか。
# RPMForgeにRHEL6.x向けのddclientあるようですし。
# ちなみにウチではddclientはDebian側で動作していて、切れたりすると通知メールが上がってきますね。

>#!/usr/local/bin/perl (which perl 実行結果 /usr/local/bin/perl と表示がでたのでそれに従いました)

自分でperl入れたのでしょうか?
CentOSのパッケージなら/usr/bin/perlかと思われますが。

この回答への補足

スクリプト使用はとりあえずやめて、下記操作をしました。

vi /var/log/result.log (空のまま保存)
chmod 700 /var/log/result.log
crontab -e を実行して下記内容を貼り付ける。
*/10 * * * * wget -O - "更新サイトアドレス=ドメイン名&pw=xxxxx" >> /var/log/result.log

10分後に、下記内容がログに記載される。

<html><body>
<a href="http://xxx.xxx/">xxx.xxx.jp</a><br>
SUCCESS: xxx.xxx.xxx.jp <= [ xxx.xxx.xxx.188 ]<br>
IPアドレス更新完了.<br>※IPアドレスに変更がありませんため、パスワードはチェック しておりません。<br>
2012/04/26 19:30:01<br>
<input type="button" value="閉じる" onclick="window.close();">
</body></html>

10分枚に更新されるよう設定しました。ログにも更新内容が記載され続けています。なぜかメールは届きません。もっともメールでたくさんログが送られて来るのもこまりものですが。

とりあえず、これで良しとしようと思います。 ただ、PWが平分で流れるのが心配です。 また何かいい方法があるか調べてみます。

ご回答頂いた方々に感謝申し上げます。 ありがとうございました。

補足日時:2012/04/26 20:12
    • good
    • 0
この回答へのお礼

回答頂き、ありがとうございます。
cornのログを見ると、プロセスとしては、問題なく実行されているようです。 問題はスクリプトの中身のようです。

スクリプトでは /usr/local/bin/perl としたのは、ln -s /usr/bin/perl /usr/local/bin/perl を実行したためです。そのため、Which perlを実行すると、シンポリックリンクを貼った階層が表示されます。

perl本体は、/usr/bin/にあるので、スクリプトを/usr/bin/perl に戻しました。 それとwgetが/usr/binにあったにもかかわらず、スクリプト内では /usr/local/binにしていました。その内容も変更しました。結果、やはり同じでメールも届かないし、スクリプト内で記載しているddns.log に結果を出すよう指定しているにもかかわらず、ログがありませんでした。

以前、Vinelinux4.2でこのスクリプトを使ってcrontabに登録したときは、/var/log/ddns.logが自動生成され正常にアップデートが成功している記録が見れました。

スクリプトの記載ミスか何かの問題だと思います。 もう少し、頑張ってみます。 わからなければ、ほかの自動更新スクリプトを見つけるか、ddclientなどを導入してみます。

ありがとうございました。

お礼日時:2012/04/26 12:44

>/etc/crontab これを実行すると -bash: /etc/crontab: 許可がありません



ただの設定ファイルですから当たり前です。
crontab「コマンド」は別にありますし。
# って昔おんなじような回答したことがあったような気がするな…。

crontab「コマンド」を実行した場合は指定されたユーザ(ユーザ指定していなければcrontabコマンドを実行したユーザ)権限で、記述したコマンドを実行することになります。
/var/spool/cron/以下にファイルが作成されます。
# 実際のパスはディストリビューションによります。
/etc/crontabはシステムに登録されたもので、crontabコマンドでの操作とは関係ありません。
そんなワケで実行ユーザを指定するフィールドがあります。
# 設定ファイルですから「実行」とかはありません。
# 「/etc/fstabを実行」とかしませんよね?

man 1 crontab
man 5 crontab
man crontabs
とか参照して下さい。
# CentOS6.2で確認。crontabsパッケージやanacronパッケージとか入っていたりはしますが。

>少し気になるのは、crontabe -eの場合、コマンドラインだけ記載すべきなのでしょうか。 最初に起動時、空白だったので、SHELL,PATH,MAILTO,HOME及びrun-partsの内容を貼り付けましたが、正しい操作だったのでしょうか。

SHELL,PATH,MAILTO,HOMEの設定は問題ないでしょうが…
run-partsが正しく動作するかは…どうなんでしょうかねぇ。
正しく設定すればcrontab -eでもrun-partsは動作する…かな。
試したことはありませんが。
# その際、/etc/crontabとは書式が異なりますのでご注意を。


rootで/etc/crontabを編集
=>システム全体の設定。実行ユーザの指定がある。
一般ユーザ(ユーザ名がuser)で/etc/crontabを編集
=>パーミッション関係でたぶん蹴られる。
rootでcrontab -e
=>/var/spool/cron/root に書き込まれ、rootユーザ権限で動作する為、実行ユーザの指定は不要。
一般ユーザ(ユーザ名がuser)でcrontab -e
=>/var/spool/cron/user に書き込まれ、userユーザ権限で動作する為、実行ユーザの指定は不要。
    • good
    • 0
この回答へのお礼

回答いただき、ありがとうございます。

crontab -e でユーザフィールドは省いてコマンド入力しましたが、メールに帰ってくるエラーは同じでした。 

Vinelinux使用当時は、単純にvi /etc/crontab でユーザフィールド及びコマンドを記載して正常に動作していたので、あまりcrontabのことを深く理解せず便利ツール程度にしか思っていませんでした。

CentOS6.2では、ネットで調べたところcronプロセスのほかに、anacronプロセス(遅延実行)も動作しているため、設定しても時間通り動作しないことがあると記載がありました。/etc/cron.d , /etc/crontab , /var/spool/cron (crontab -e) に設定することで時間通り動作するとの説明もあったのですが、ややこしかったのでcronie-noanacronのインストールとcronie-anacronのアンインストール実行しました。

この場合、単純に/etc/cron.d/0hourly,/etc/cron.d/dailyjobs にコマンドを従来どおり記載することでうまく動作するとありましたので、 /etc/cron.d/0hourlyに下記内容で記載しました。 cronログで見ると定期的時間通り、定期的に実行されているようですが、なぜかメールが届きません。rootのままで、届いていたのに、届かなくなりました。 ただ、awstatsのコマンドのほうは、3時間に一回の実行設定ですが、正常に動作しているメールが届きます。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly
# DDNS
*/10 * * * * root perl /usr/ddns/ipchk.pl
00 5 * * 0 root rm -f /usr/ddns/CRT_IP.dat
# awstats
00 0-23/3 * * * root /root/awstats.sh

例えば、DDNSの実行結果を/var/log/フォルダ内に適当なログを作り、そこに出力させるようコマンドの後などに付け足すことは出来るのでしょうか。

お礼日時:2012/04/25 22:44

http://d.hatena.ne.jp/geek_it/20100121/1264097935
にそのまんまの事例が書かれていますね。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。 crontab -e の場合、ユーザフィールドを排除すると言うことは知りませんでした。 下記内容に変更しました。

# DDNS
*/10 * * * * perl /usr/ddns/ipchk.pl
00 5 * * 0 rm -f /usr/ddns/CRT_IP.dat

お礼日時:2012/04/25 12:42

>エラー内容 /bin/bash: root: command not found



「rootってコマンドが見つかりません。」
と言っています。

/etc/crontabとcrontab -eで編集するファイルとでは書式が異なりますがその辺りは理解されています?

/etc/crontabでは実行ユーザを指定するフィールドがあったりしますけど。
# コマンドと認識されてしまったrootがソレにあたるかと。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。/etc/crontabとcrontab -e の違いは、実行ユーザを指定するか、しないかと言うことでしょうか。

/etc/crontab これを実行すると -bash: /etc/crontab: 許可がありません、とエラーが出ます。権限を確認すると以下のとおりでした。 root権限でログインして実行しているのですが?

-rw-r--r-- 1 root root 457 4月 24 23:43 2012 crontab

crontab -e でユーザフィールを削除して下記のとおりしました。 少し気になるのは、crontabe -eの場合、コマンドラインだけ記載すべきなのでしょうか。 最初に起動時、空白だったので、SHELL,PATH,MAILTO,HOME及びrun-partsの内容を貼り付けましたが、正しい操作だったのでしょうか。

コマンドでは10分ごとに実行するよう設定して、スクリプトでは、ログの内容を /var/log/ddns に記載するようになっていると理解しています。 しかし、10分経過しても /var/log/無いにはddsnすら存在しないです。 MAILTOは空白にしました。あまりにもメールが届くので。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

# DDNS
*/10 * * * * perl /usr/ddns/ipchk.pl
00 5 * * 0 rm -f /usr/ddns/CRT_IP.dat

お礼日時:2012/04/25 12:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!