在 Hyper-V 虛擬機器上設定了 crontab 卻不會執行,後來發現不是 cron 的問題,而是虛擬機器的時鐘變慢了,導致 cron 不會按時執行。我的解決方法是利用網路校時,並且排進 crontab 每 30 分鐘就校時一次。
網路校時的指令是
sudo ntpdate time.stdtime.gov.tw
選用的 NTP 伺服器是 time.stdtime.gov.tw。接著將正確時間寫入硬體時鐘
sudo hwclock -w
利用 crontab 定期校時
*/30 * * * * root (/usr/sbin/ntpdate time.stdtime.gov.tw && /sbin/hwclock -w) &> /dev/null
原先我是設定每 6 小時校時一次,沒想到過了一晚再看虛擬機器裡的時鐘竟然慢了 12 小時,只好改成每 30 分鐘就校時一次,希望能有所改善。
在查資料的時候,才發現原來 Hyper-V 本身就有讓 VM 與 Host 對時的服務,但我不知道為什麼我的電腦上沒有作用。可能是因為語系的關係,查詢有開啟「時間同步化」服務的 VM 的 powershell script 要改成如下:
Get-VMIntegrationService -VMName * | Where {$_.Name -eq '時間同步化'} | Select-Object VMName, Name, Enabled
參考網址:
- Linux 設定 crontab 例行性工作排程教學與範例
- Linux 設定 NTP 同步系統時間,自動網路校時教學
- How To Fix Hyper-V Clock Skew Issues