GNU/Linux >> Linux の 問題 >  >> Linux

dmesg 時間とシステム時間の時間が正しくありません

解決策 1:

dmesg は、開始からの秒単位のアップタイムをタイムスタンプとしてログに記録するカーネル リングバッファを出力するだけです。

したがって、-T オプションを使用すると、この稼働時間の値はすべて、システムが起動された日付に追加されます。サスペンドまたはレジュームでスリープしていた場合、それらは失われます。この場合、日付/時刻の値が正しくなく、過去に戻るため、-T オプションは役に立ちません。

解決策 2:

あなたの理論 (ちなみに、これは正しいです) を検証するには、root として以下を実行してください:

hwclock --show

これにより、コマンドを実行しているサーバーのハードウェア クロックが表示されます。

ハードウェア クロックをシステム時間 (ntp によって管理される) と同期するには、次のコマンドを実行します:

hwclock --systohc --utc

最後の引数 (--utc) は、ハードウェア クロックの時刻を協定世界時で格納するように hwclock に指示します。

さらに、dmesg(1) の man ページには次のように記載されていることに注意してください。これにより、発生している動作が文書化され、有効になります。

   -T, --ctime
          Print human-readable timestamps.

          Be aware that the timestamp could be inaccurate!  The time
          source used for the logs is not updated after system
          SUSPEND/RESUME.

解決策 3:

dmesg の「最近の」エントリの正確な時刻を取得するには 、出力をハッキングすることで、dmesg タイムスタンプをリアルタイムに変換できます。

「最近」とは、(他の人がすでに指摘しているように) 中断時間は dmesg タイムスタンプにカウントされないため、最後の中断/再開後の時間を意味します。

ただし、ノートブックのように頻繁に必要な場合は、次のようなものを関数またはエイリアスに入れることができます:

# write current time to kernel ring buffer so it appears in dmesg output
echo "timecheck: $(date +%s) = $(date +%F_%T)" | sudo tee /dev/kmsg

# use our "timecheck" entry to get the difference
# between the dmesg timestamp and real time
offset=$(dmesg | grep timecheck | tail -1 \
| perl -nle '($t1,$t2)=/^.(\d+)\S+ timecheck: (\d+)/; print $t2-$t1')

# pipe dmesg output through a Perl snippet to
# convert it's timestamp to correct readable times
dmesg | tail \
| perl -pe 'BEGIN{$offset=shift} s/^\[(\d+)\S+/localtime($1+$offset)/e' $offset

# or use this instead to keep dmesg colors
dmesg --color=always | tail \
| perl -pe 'BEGIN{$offset=shift} s/^(\x1b\[.*?m)?\[(\d+)\S+/$1.localtime($2+$offset)/e' $offset

出力例:

...
Sat Jun 29 11:12:28 2019 wlp3s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 10:5a:f7:53:1d:0f
Sat Jun 29 11:12:28 2019 IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
Sat Jun 29 11:34:16 2019 timecheck: 1561800856 = 2019-06-29_11:34:16
Sat Jun 29 12:10:11 2019 wlp3s0: cannot understand ECSA IE operating class, 5, ignoring

元の dmesg との比較 出力 (3 日ずれています):

$ dmesg | tail -4
[249424.746958] wlp3s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 10:5a:f7:53:1d:0f
[249424.749662] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
[250732.318826] timecheck: 1561800856 = 2019-06-29_11:34:16
[252887.828699] wlp3s0: cannot understand ECSA IE operating class, 5, ignoring

$ dmesg -T | tail -4
[Wed Jun 26 17:59:09 2019] wlp3s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 10:5a:f7:53:1d:0f
[Wed Jun 26 17:59:09 2019] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
[Wed Jun 26 18:20:57 2019] timecheck: 1561800856 = 2019-06-29_11:34:16
[Wed Jun 26 18:56:52 2019] wlp3s0: cannot understand ECSA IE operating class, 5, ignoring

Linux
  1. Linux システムの再起動日時を表示する方法

  2. System.currentTimeMillis は常に値 >=以前の呼び出しを返しますか?

  3. Linux で C++ を使用してシステムの日付と時刻を設定する

  1. 複数のコマンドの実行時間を計る

  2. Ubuntu のシステム プロンプトでパスワードを偽装できませんか?

  3. Linux システムはどのくらい稼働していますか?

  1. timedatectlコマンドを使用してRHEL7Linuxシステムの日時を変更する

  2. Kgotobed –システムを強制的にシャットダウンするカーネルモジュール

  3. DebianLinuxでタイムゾーンを変更する方法