LoginSignup
6
3

More than 5 years have passed since last update.

dateコマンドでサーバの時刻を変更しても,少し経つと勝手に時刻が戻されてしまうのでいっそのことサーバの時刻を0.1秒間隔で変更し続ける

Last updated at Posted at 2017-01-06

TL;DR

$ sudo watch -n0.1 date 012213002017

※ サーバの時間を0.1秒間隔で変更し続けます

そもそも何がしたかったのか

サーバの時刻を好きな値に設定して,日付によって挙動がガラリと変わるプログラムのチェックを行おうとしていました。
今回大切なのは日付で,時刻はまぁある程度指定出来れば何時でも大丈夫でした。

どんな問題が起きたか

dateコマンドでLinuxサーバの時刻変更 - Qiitaを参考にしてdateコマンドでサーバの時刻を変更したはいいけれど,少し時間が経つと勝手に時刻が戻ってしまいます

$ date
2017年  1月  6日 金曜日 14:20:01 JST

$ sudo date -s "2017/01/22 13:00"
2017年  1月 22日 日曜日 13:00:00 JST
>>> elapsed time 382h39m57s

$ date
2017年  1月 22日 日曜日 13:00:01 JST

$ date
2017年  1月 22日 日曜日 13:00:02 JST

$ date
2017年  1月 22日 日曜日 13:00:03 JST

$ date
2017年  1月 22日 日曜日 13:00:04 JST

$ date
2017年  1月 22日 日曜日 13:00:05 JST

$ date
2017年  1月 22日 日曜日 13:00:06 JST

$ date
2017年  1月 22日 日曜日 13:00:08 JST

$ date
2017年  1月 22日 日曜日 13:00:09 JST

$ date
2017年  1月  6日 金曜日 14:20:14 JST

えぇ…… なんでぇ……。
もちろんcronやら何やらで戻しているわけでもなく,他の誰かがイジっているわけでもなく……。

ちょこっと調べてみると,-sは本来時刻を設定するオプションではないとかなんとか。
そうなの? じゃあ……。

$ date
2017年  1月  6日 金曜日 14:21:57 JST

$ sudo date 012213002017
2017年  1月 22日 日曜日 13:00:00 JST
>>> elapsed time 382h38m1s

$ date
2017年  1月 22日 日曜日 13:00:01 JST

$ date
2017年  1月 22日 日曜日 13:00:02 JST

$ date
2017年  1月 22日 日曜日 13:00:03 JST

$ date
2017年  1月  6日 金曜日 14:22:04 JST

はい,関係ナス。

定期的に実行する

Linuxには定期的にコマンドを実行する方法として,watchコマンドがあるみたいです。
今回は正確には年月日を指定したくって,時間はまぁどうでも良かったので,今度は0.1秒間隔で指定した日時に変更し続けることを考えます。

早速watchコマンドを使います。
いざ!!

$ sudo watch -n1 date -s "2017/01/22 13:00"
Every 1.0s: date -s 2017/01/22 13:00                                                       Fri Jan  6 14:23:39 2017
date: the argument `13:00' lacks a leading `+';
                                              when using an option to specify date(s), any non-option
                                                                                                     argument must be a format string beginning with `+'
                                                                                                                                                        詳しくは `date --help' を実行して下さい.

ちょっと上手くいったかと思いましたが今度は少し経つとエラーが出ます。
なんだかdateコマンドのオプションとして指定している"2017/01/17 13:00"半角スペースの所為か13:00で変な解釈? が始まっている? っぽいのかなこれ?

で,あればスペースを抜けば良いのかな?
と言うことでコチラを実行したところ,安定して動作します。

$ sudo watch -n1 date 012213002017
Every 1.0s: date 012213002017                                                             Sun Jan 22 13:00:01 2017

2017年  1月 22日 日曜日 13:00:00 JST

これでも安定したとは言え,たまーに,ふと元の時刻に戻る事があります。
watchの実行間隔は現在1.0[s]としているので,この合間を縫って勝手に時刻が戻ることがあるのでしょう。

解決

$ sudo watch -n0.1 date 012213002017
Every 0.1s: date 012213002017                                                             Sun Jan 22 13:00:00 2017

2017年  1月 22日 日曜日 13:00:00 JST

素晴らしい……。
やっと思うように 日付を変更 0.1秒間隔で指定した日時に変更し続けることが出来ました。

以上!!

※ サーバの解釈する時をほぼ止めるような挙動になるので,本番などのサーバ上では行わないように注意をして下さい
※ ローカル環境などの,自分しか触らないようなサーバでのみ試してみて下さい

6
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3