解決Linux的crontab沒有執行ntpdate的問題
前言:在我們的項目中,需要同步Linux伺服器的時間,於是用到了ntpdate命令,就在crontab中進行了配置,設定為每個小時的整時分鐘進行同步,完了後就一直沒有關注,因為這很簡單,經驗主義告訴我,既然手動使用ntpdate命令就可以同步時間成功,放在cron進程(是Linux的一個守護進程,如果啟動後,會每隔一分鐘去檢查對應的crontab檔案,root使用者的在/var/spool/cron)中就更沒有問題了,然而,今天看Linux伺服器的時間後,發現和Windows時間差上了好幾分鐘,我們的Linux服務承載著期貨交易平台的定時服務,比如說,9點半開盤等等,這就意味著時間不準確啊,於是就調查解決問題,有了下面的記錄
1.使用crontab -l命令查看定時服務
[root@MyCloudServer xxx]# crontab -l0,10,20,30,40,50 * * * * ntpdate time.windows.com &>/xxx/ntpdate.log
2.看起來好像沒有問題啊,vim /var/spool/mail/root(定時服務日誌會存放在該檔案中)查看定時服務日誌,發現有如下資訊
/bin/sh: ntpdate: command not found
說明定時服務在/bin/sh目錄中去找ntpdate命令,並且沒有找到3.使用whereis ntpdate命令看看該命令在什麼目錄下
[root@MyCloudServer cron]# whereis ntpdatentpdate: /usr/sbin/ntpdate /usr/share/man/man8/ntpdate.8.gz
問題找到了,在定時服務中,ntpdate命令要使用全路徑4.使用crontab -e命令修改一下,加上ntpdate命令的目錄
0,10,20,30,40,50 * * * * /usr/sbin/ntpdate time.windows.com &>/xxx/ntpdate.log
然而儲存後,等到整數分鐘後,在日誌中沒有發現該命令執行,為什麼呢,猜想如下
a.以上命令格式錯誤,時間格式錯誤
b.cron自動服務沒有執行
通過網上尋找時間的命令格式,發現
0,10,20,30,40,50 * * * *
並沒有錯誤,而手動執行
/usr/sbin/ntpdate time.windows.com &>/xxx/ntpdate.log
也成功執行,那麼就看看b是否存在問題5.執行ps -ef | grep cron,查看時間服務進程是否存在
[root@MyCloudServer xxx]# ps -ef | grep cronroot 26157 22992 0 10:04 pts/3 00:00:00 grep cron
發現沒有cron執行進程6.執行service crond status查看服務狀態
[root@MyCloudServer xxx]# service crond statuscrond is stopped
竟然服務沒有啟動,好吧7.啟動進程,並且查看狀態
[root@MyCloudServer xxx]# service crond startStarting crond: [ OK ][root@MyCloudServer xxx]# service crond statuscrond (pid 26291) is running...[root@MyCloudServer xxx]# ps -ef | grep cronroot 26291 1 0 10:06 ? 00:00:00 crondroot 26302 22992 0 10:06 pts/3 00:00:00 grep cron
8.服務啟動了,通過vim /etc/rc.d/rc.local命令添加以下語句設定為開機啟動
/sbin/service crond start
注意也加上了/sbin目錄9.最後再看看ntpdate.log中有沒有執行日誌
[root@MyCloudServer xxx]# cat ntpdate.log 29 Dec 11:10:16 ntpdate[29960]: no server suitable for synchronization found
探索服務器沒有找到對應的服務同步,那麼猜想應該是time.windows.com伺服器在本台伺服器上沒有擷取成功,由於我們用的是香港的雲端服務器,那麼換一個香港認可的地址試試
0,10,20,30,40,50 * * * * /usr/sbin/ntpdate stdtime.gov.hk &>/xxx/ntpdate.log
然後等到整時分鐘的時候再次查看一下
[root@MyCloudServer xxx]# cat ntpdate.log 29 Dec 11:20:01 ntpdate[30580]: adjust time server 118.143.17.82 offset 0.015206 sec
可以看到執行成功了
總結:通過以上問題調查,發現無論什麼時候經驗主義並不可靠,小小的一個問題都可能引發很多原因。