- ベストアンサー
crontabの設定について
- crontabの設定についての質問です。CentOS6.2でIPアドレスの自動アップデートスクリプトを作成し、crontabを設定しましたがエラーが発生しています。
- 質問者はCentOS6.2でIPアドレスの自動アップデートスクリプトを作成し、crontabを設定しましたが、エラーが発生しています。crontabの編集方法やスクリプトの内容を確認したいとのことです。
- CentOS6.2でIPアドレスの自動アップデートスクリプトを作成し、crontabを設定しましたが、エラーが発生しています。具体的なエラーメッセージと設定内容がありますので、アドバイスをお願いします。
- みんなの回答 (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かと思われますが。
その他の回答 (3)
- Wr5
- ベストアンサー率53% (2173/4061)
>/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ユーザ権限で動作する為、実行ユーザの指定は不要。
お礼
回答いただき、ありがとうございます。 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/フォルダ内に適当なログを作り、そこに出力させるようコマンドの後などに付け足すことは出来るのでしょうか。
- Wr5
- ベストアンサー率53% (2173/4061)
http://d.hatena.ne.jp/geek_it/20100121/1264097935 にそのまんまの事例が書かれていますね。
お礼
ご指摘ありがとうございます。 crontab -e の場合、ユーザフィールドを排除すると言うことは知りませんでした。 下記内容に変更しました。 # DDNS */10 * * * * perl /usr/ddns/ipchk.pl 00 5 * * 0 rm -f /usr/ddns/CRT_IP.dat
- Wr5
- ベストアンサー率53% (2173/4061)
>エラー内容 /bin/bash: root: command not found 「rootってコマンドが見つかりません。」 と言っています。 /etc/crontabとcrontab -eで編集するファイルとでは書式が異なりますがその辺りは理解されています? /etc/crontabでは実行ユーザを指定するフィールドがあったりしますけど。 # コマンドと認識されてしまったrootがソレにあたるかと。
お礼
ご回答、ありがとうございます。/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
お礼
回答頂き、ありがとうございます。 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などを導入してみます。 ありがとうございました。
補足
スクリプト使用はとりあえずやめて、下記操作をしました。 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が平分で流れるのが心配です。 また何かいい方法があるか調べてみます。 ご回答頂いた方々に感謝申し上げます。 ありがとうございました。