所詮個人でやっている小さなサーバだし、ログを眺めることはあっても時刻にさほどの厳密性を持たせる必要が無かったこともあって、これまではSSHでログインした時に、思い出したようにntpdateコマンドを使って時刻合わせをしていました・・・(^_^;;
でも、やっぱりこういう余計な手作業は省きたいですし、時刻が正確であることで不利益を被ることは無いわけですから、例えば一日に一回、自動的にタイムサーバ(NTPサーバ)にアクセスして時刻合わせをさせる、みたいにしておいた方がいいよな~とは前々から思ってはいました。そう、思っては、ね。。。
で、そういう用途に使えるのがcrondであることも知っていましたが、実はcronに読み込ませるスクリプト(やコマンド)で、root権限が必要になるものはどうしたらいいんだかわからなかったんですよね~(ざっと眺めた限りでは「一般ユーザで」という説明しかヒットしなくて・・・)。
で、さらにしつこく調べてみましたところ、「crontab コマンドは /var/spool/cron/user を管理(編集/閲覧/削除)するためのコマンド」という説明があり、その例文の中で
# crontab -e
とあったことから、crontabをroot権限で管理すればroot権限で自動実行させることができるっぽいことが分かりました。
要するに、rootでcrontabを使って記述した内容は、/var/spool/cron/rootというテキストで記録されている、ということだったのです。
そこで(おそらく現在はあっても空であろうはずの)/var/spool/cron/rootの有無ならびに中身を覗いて見たところ・・・・。
# ls /var/spool/cron/
root
# less /var/spool/cron/root
00 4 * * * /etc/init.d/httpsd restart
既に/var/spool/cron/rootは作成されており、その中にはhttpsdを毎日午前4:00に再起動させるという設定が書き込まれていました(httpsdのインストール時に自動で書き込まれるものなのかな?)。
ということは、crontab -eで加筆してもいいですが、何てことはない、vi /var/spool/cron/rootで直接編集してもOKということですね!
自動実行されるかどうかを念のため目視で確認したいので、まずはここにntpdateコマンドを、直近の時間指定を行って試してみることに。
# vi /var/spool/cron/root
00 4 * * * /etc/init.d/httpsd restart
27 21 * * * /sbin/ntpdate ntp.nict.jp ← これを加筆。
(試した時間が21:25頃だったので)21:27に実行されるようにして、待つことしばし。
通常のコマンドラインでntpdateコマンドを使うと、●●秒オフセットされました、見たいな実行結果が表示されるのですが、指定した時刻を過ぎても特に画面上(もちろんSSHによる仮想端末の画面です)に変化はなし。
エラーが表示されることもないので(実行権限が無かったりすると、permission deniedのエラーが表示されることは確認済)、多分大丈夫なんだろうと思いつつ、確認したかったのでcronのログの場所を見てみることに。
ログの場所は/var/log/cronだそうなので、こいつを覗いてみます。
# tail -n 10 /var/log/cron | less
Apr 7 21:00:01 —
Apr 7 21:01:01 —
Apr 7 21:10:01 —
Apr 7 21:20:01 —
Apr 7 21:23:34 —
Apr 7 21:25:01 —
Apr 7 21:26:01 —
Apr 7 21:27:01 — crond[3880]: (root) CMD (/sbin/ntpdate ntp.nict.jp)
Apr 7 21:30:01 —
Apr 7 21:40:02 —
すると、ありました!
(※不必要そうな部分は—に置き換えてます)
どうやらちゃんと指定した時刻、21:27にcrondでntpdateが実行されたっぽいですね~(^_^)
自動実行されたっぽいことが確認できたら、後は恒久的に実行させたい時間を設定して完了です。
ただ、先ほども触れたように、nptdateは通常実行結果を標準出力に返します。今のところ仮想端末上にそれが返されない理由はわかりませんが(仮想端末は標準出力じゃないから?)、今後のことも考えて、標準出力と標準エラー出力は/dev/null(虚無)に食わせることにし、そのためにコマンドの後に「/dev/null 2>&1」をつける・・・つけるのですが。
まれにしかスクリプトをいじらない僕が後々「/dev/null 2>&1」を見て思い出せるか怪しいものです(ま、調べりゃすむことですが)。
すると同じように考える人はいるもので、そちらによれば、(ものすごく大雑把に言うと)まとめて書くから分からなくなるんだから、分けて書け、ということだそう。
具体的には
command >/dev/null 2>&1
ではなく、
command 1>/dev/null 2>/dev/null
としてみてはどうか、ということでした。
なるほど、これなら確かにわかりやすいかも。
1は標準出力で、それを/dev/nullに食わせ、同様に2の標準エラー出力も/dev/nullに食わせる、と分けて書くわけですね。
これなら忘れた頃に見直してみても、すぐに思い出せるかも。
というわけで、今回のntpdateの記述もこれにしたがって、
/sbin/ntpdate ntp.nict.jp 1>/dev/null 2>/dev/null
とすることにしました。
これでまた一つ問題がクリア。
あ、そうだ、firewallの遮断IPアドレス(クラス)リストも定期的に自動更新させるようにしておかないとな~。
でもあれは実行にものすごく時間がかかるから、他のタイムテーブルとバッティングしないような時間を見定めないと危険だな(笑)
One thought to “ntpdateをcronで定期的に自動実行させる”