MacBookの狂った時計を直す

カレンダーがおかしい???
---
しばらく振りに起動したMacBook。なぜだかシステム時計が1か月ぐらい遅れている上に、システム設定の「日付と時刻を自動的に設定」のオンオフを繰り返してみても一向に治らない。
仕方なく一旦は手動で正しい日時に直したが、納得がいかず、解決方法をネット検索してみると以下のページに辿り着いた。

この記事は、そのページで使われているターミナルコマンドの説明です。ターミナルコマンドに詳しい方には不要な記事となります。

#### システム環境
MacBook Pro (Intel)
macOS Sonoma 14.1.1

参考にしたページ
---

https://discussionsjapan.apple.com/thread/252960467?sortBy=best


参考ページに習って、ターミナルで以下のコマンドを打って解決しました。

```terminal
$ sudo rm /var/db/timed/com.apple.timed.plist

$ sudo sntp -S ntp.nict.jp
-8.836065 +/- 0.006581 ntp.nict.jp 2001:df0:232:eea0::fff4

$ sudo sntp -S ntp.nict.jp
+0.000710 +/- 0.007049 ntp.nict.jp 2001:df0:232:eea0::fff4

$ sudo sntp -S ntp.nict.jp
+0.000160 +/- 0.007103 ntp.nict.jp 2001:df0:232:eea0::fff4

$ sudo sntp -S ntp.nict.jp
-0.000140 +/- 0.006243 ntp.nict.jp 2001:df0:232:eea0::fff4

$ ps -ef | grep timed
  266   138     1   0  3:42PM ??         0:00.18 /usr/libexec/timed
  501  2699  2585   0  8:10PM ttys000    0:00.00 grep --color=auto timed

$ sudo kill 138

$ sudo sntp -S ntp.nict.jp
+0.000600 +/- 0.005991 ntp.nict.jp 2001:df0:232:eea0::fff3

$ date
2024年 1月 8日 月曜日 20時11分23秒 JST

```

コマンドの説明
---
まずは、ファイル `/var/db/timed/com.apple.timed.plist` を削除します。

```terminal
$ sudo rm /var/db/timed/com.apple.timed.plist
```
このファイルは、macOSオペレーティングシステムにおける`timed`というシステム時計の管理を行うデーモンの設定ファイルです。これにはシステム時計の同期設定や過去の同期状態などが保存されています。例えば、NTPサーバーとの時刻同期の設定や、最後に同期した時の情報が含まれています。このファイルを削除することで`timed`デーモンの状態をリセットします。

:::note info
デーモンとは、ユーザーの介入なしにバックグラウンドで実行されるプログラムやプロセスのことで、通常はシステムの起動時に開始され、シャットダウンまで動作し続けます。
:::

次に、システムの時計を指定されたNTPサーバー（この場合は`ntp.nict.jp`）と同期します。

```terminal
$ sudo sntp -S ntp.nict.jp
```

この実行に対するレスポンスは、以下のとおりです。
```terminal
-8.836065 +/- 0.006581 ntp.nict.jp 2001:df0:232:eea0::fff4
```
これは、システム時計とNTPサーバー間の時刻差とその精度を表しています。

+ `-8.836065`: これはシステム時計がNTPサーバー時刻より約8.836秒遅れていることを示します。負の値はシステム時計が遅れていることを意味します。
+ `+/- 0.006581`: これは測定の精度で、ゼロに近いほど精度が高いことになります。
+ `ntp.nict.jp`: これは同期を試みたNTPサーバーの名前です。
+ `2001:df0:232:eea0::fff4`: これはNTPサーバーのIPv6アドレスです。

このコマンドの実行により8.836秒遅れていたシステム時計がサーバー時刻に合わせて調整されました。
そして、参考ページの例にならって、同じコマンドを4回繰り返しています。

次に、`timed`という文字列が名前に含まれるプロセスを検索します。
```terminal
$ ps -ef | grep timed
```

+ `ps -ef`: これは「Process Status」のコマンドで、システム上で実行中の全てのプロセスの詳細なリストを表示します。`-e`フラグはすべてのプロセスを、`-f`フラグはフルフォーマットでの情報を意味します。
+ `|`: これはパイプと呼ばれ、一つのコマンドの出力を別のコマンドへと渡すために使用されます。
+ `grep timed`: これは `ps`コマンドの出力から「timed」という文字列を含む行を検索します。`grep`はテキスト検索ツールです。

結果として、このコマンドはシステム上で実行中の `timed`デーモンの詳細を表示します。これは、特定のプロセスが実行中かどうかを確認したり、そのプロセスに関する情報を得るために使用されます。

```terminal
  266   138     1   0  3:42PM ??         0:00.18 /usr/libexec/timed
```
+ `266`: プロセスの実行ユーザーID。
+ `138`: プロセスID。
+ `1`: 親プロセスID。1は通常、システムのinitプロセスを示します。
initプロセスとは、システムの起動時にカーネルによって最初に実行され、その後のシステムの初期化と他のプロセスの起動を管理するものです。
+ `0`: プロセスの優先度。小さいほど優先度が高い。
+ `3:42PM`: プロセスの開始時刻。
+ `??`: このプロセスが制御端末（tty）に関連付けられていないことを示します。
UNIX系のオペレーティングシステムにおいて、プロセスが制御端末（tty）に関連付けられていない場合、それはバックグラウンドで動作しているデーモンプロセスやシステムサービスであることを意味します。プロセスには通常、ユーザーの入力を受け取るための端末が割り当てられますが、「??」と表示される場合、そのプロセスは端末から独立しており、対話的な入力を必要とせず、バックグラウンドで自動的に実行されることを示しています。
+ `0:00.18`: プロセスがCPUに使用された合計時間。
+ /usr/libexec/timed: 実行中のプロセスのコマンド名。これが時刻同期`timed`デーモンです。

```terminal
  501  2699  2585   0  8:10PM ttys000    0:00.00 grep --color=auto timed
```
これは `grep`コマンド自体の情報です。つまり、`grep`コマンドを実行しているプロセスの情報を表示しています。
要するに、この出力は `timed`デーモンが実行中であること、そしてその瞬間に `grep`コマンドも実行されていることを示しています。

そして、以下で時刻同期`timed`デーモンのプロセスID`138`を指定して終了させます。
```terminal
$ sudo kill 138
```
もう一度、`sntp`コマンドを実行して時刻合わせと同時に`timed`を再起動しています。
```terminal
$ sudo sntp -S ntp.nict.jp
+0.000600 +/- 0.005991 ntp.nict.jp 2001:df0:232:eea0::fff3
```
最後に、現在時刻を確認しています。
```terminal
$ date
2024年 1月 8日 月曜日 20時11分23秒 JST
```

ゴメンね、MacBook
---
macOSはUNIXベースで、多くのUNIXシステムと共通の特徴を持っています。LinuxもUNIXの設計思想に基づいており、macOSでの学習経験はLinuxサーバーの管理や運用の知識にもつながることでしょう。
今回の対応で、これらのちょっとした知識を得ることができました。無駄なく他でも役立つ知識が自然と身についていくのは効率的でいいですね。Macの人気の源はこんなところにもあるのかもしれません:blush:
MacBookよ、ほったらかしにしてゴメンね:pray: