ntpdateコマンド

ntpdateコマンドは、NTPサーバに問い合わせてローカルのシステム・クロックを合わせるためのコマンドです。
多くの場合、ntpdが動いていて、こいつがゆっくりと時刻を合わせてくれるのでこっちの方がよいのですが、偶に激しく時刻がずれたときにはntpdateが便利です。

ntpdate (NTPサーバのホスト名 or IP)

コマンドライン引数


usage: ntpdate [-bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-r rate] [-t timeo] [-U username] server

cronでntpdateを自動実行する場合の注意


ntpdateコマンドは標準入力が開いた状態でないとうまく動かない。
だからcronなどから実施する場合には、標準入力が閉じられているのでうまくいかない。
その場合には、以下のようにして無理矢理に標準入力を開いておく
ntpdate (NTPサーバのIPアドレス) < /dev/zero

ntpdateコマンドとSIGALRM


ntpdateコマンドをC言語の中からfork() && exec()することがあるかもしれない。最近、pthread の中からntpdateコマンドをコールしたけど全く動かないという経験をした。

原因は、SIGALRMがマスクされていたため。

pthreadなどでは、勝手にシグナルを受けられると困るので、同期シグナル以外は全てマスクしてしまったりする。すると、このpthreadの中からはntpdateが全く動かないことになります。そのとき、以下のような出力がずっと出ていました。

Looking for host (NTPサーバのIP) and service ntp
host found : (NTPサーバのIP)
25 Mar 23:29:16 ntpdate[16129]: poll(): nfound = 0, error: Address family not supported by protocol
25 Mar 23:30:16 ntpdate[16129]: poll(): nfound = 0, error: No such file or directory
25 Mar 23:31:16 ntpdate[16129]: poll(): nfound = 0, error: No such file or directory
25 Mar 23:32:16 ntpdate[16129]: poll(): nfound = 0, error: No such file or directory

中々判り難いエラーです。結局以下のようにしました。
sigset_t sig_mask;

sigfillset(&sig_mask);
#ifdef SIGALRM
    sigdelset(sig_mask, SIGALRM);
#endif
(void) pthread_sigmask(SIG_SETMASK, &sig_mask, NULL);
2006年03月26日(日) 00:59:54 Modified by hc75ybwf




スマートフォン版で見る