使用Linux crontab命令自動重啟服務
迴圈執行的計劃任務
,Linux系統則是由cron/crond
這個系統服務來控制的。Linux系統上面原本就有非常多的計劃性工作,因此這個系統服務是預設啟動的。另外,由於使用者自己也可以設定計劃任務,所以Linux系統也提供了使用者控制計劃任務的命令crontab
。
一、crond簡介
crond
是Linux下用來週期性地執行某種任務或等待處理某些事件的一個守護程序
。與Windows下的計劃任務類似,當安裝完成作業系統後,預設會安裝此服務工具,並且會自動啟動crond程序。crond程序每分鐘會定期檢查是否有要執行的任務
,如果有要執行的任務,則自動執行該任務。
Linux下的任務排程 分為兩類,系統任務排程和使用者任務排程 。
系統任務排程是指系統週期性所要執行的工作,比如寫快取資料到硬碟、日誌清理等。在/etc
目錄下有一個crontab
檔案,這個就是系統任務排程的配置檔案
。
$ cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # |.------------- hour (0 - 23) # ||.---------- day of month (1 - 31) # |||.------- month (1 - 12) OR jan,feb,mar,apr ... # ||||.---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # ||||| # ***** user-name command to be executed
前四行是用來配置crond
任務執行的環境變數。第一行SHELL
變數指定系統要使用哪個shell
,這裡是bash
;第二行PATH
變數指定系統執行命令的路徑;第三行MAILTO
變數指定crond的任務執行資訊將通過電子郵件傳送給root
使用者,如果值為空,則表示不傳送任務執行資訊給使用者;第四行HOME
變數指定在執行命令或者指令碼時使用的主目錄。
使用者任務排程是指使用者定期要執行的工作,比如使用者資料備份、定時郵件提醒等。
使用者可以使用crontab
工具來定製自己的計劃任務。
所有使用者定義的crontab檔案
都被儲存在/var/spool/cron
目錄中。其檔名與使用者名稱一致。
使用者所建立的crontab檔案 中,每一行都代表一項任務,每行的每個欄位代表一項設定 。它的格式共分為六個欄位,前五段是時間設定段,第六段是要執行的命令段,格式如下:
minute hour day month week command
二、crond服務
三、crontab命令詳解
$ man crontab
5. 使用示例
示例1:每1分鐘檢測是否需要重啟ZooKeeper伺服器程序
命令:
*/1 * * * * sh /data/program/wacai-zookeeper-3.5.3-beta/bin/zkServer-crontab.sh >/dev/null 2>&1 &
#!/usr/bin/env bash # # 當ZK伺服器程序出現異常時,基於Linux定時器自動執行本指令碼重啟程序。 # 異常場景:OOM、程序僵死、機器斷電 # # crontab -e # */1 * * * * sh /data/program/wacai-zookeeper-3.5.3-beta/bin/zkServer-crontab.sh >/dev/null 2>&1 & # # 設定使用者環境變數 source ~/.bash_profile ZOO_PID=`jps -mlv | grep "QuorumPeerMain" | awk '{print $1}'` if [ "x$ZOO_PID" != "x" ] then # ZK程序執行中,無需重啟,結束檢測 echo "ZooKeeper server is running, process id: $ZOO_PID" exit 1 fi echo "Restart zookeeper server" # 使用`restart`命令防止ZK伺服器異常終止的場景(`data/zookeeper_server.pid`檔案還在) /data/program/zookeeper-3.5.3-beta/bin/zkServer.sh restart # 傳送告警訊息 curl -H "Content-Type: application/json" -d '{"title":"ZooKeeper測試叢集告警","type":"wechat|email","to":["dannong"],"content":"ZooKeeper測試叢集節點 '`hostname`' 已重啟"}' http://crow.devops.k2.test.xxx.info/api/message
四、使用注意事項
1. 注意環境變數問題
有時我們建立了一個crontab
,但是這個任務卻無法自動執行,而手動執行這個任務卻沒有問題
,這種情況一般是由於在crontab檔案中沒有配置環境變數引起的
。
在crontab檔案中定義多個排程任務時,需要特別注意的一個問題就是環境變數的設定
。因為我們手動執行某個任務時,是在當前shell環境下進行的,程式當然能找到環境變數,而系統自動執行任務排程時,是不會載入任何環境變數的
。因此,需要在crontab檔案中指定任務執行所需的所有環境變數
,這樣系統執行任務排程時就沒有問題。
不要假定cron知道所需要的特殊環境,它其實並不知道。所以你要保證在shell指令碼中提供所有必要的路徑和環境變數 ,除了一些自動設定的全域性變數。所以注意如下3點:
- 指令碼中涉及檔案路徑時寫全域性路徑(絕對路徑);
-
指令碼執行要用到
java
或其他環境變數時,通過source
命令引入環境變數; - 當手動執行指令碼OK,但是crontab死活不執行時。這時必須大膽懷疑是環境變數惹的禍,並可以嘗試在crontab中直接引入環境變數解決問題。
2. 注意清理系統使用者的郵件日誌
每條任務排程執行完畢,系統都會將任務輸出資訊通過電子郵件的形式傳送給當前系統使用者
,這樣日積月累,日誌資訊會非常大,可能會影響系統的正常執行。因此,將每條任務進行重定向處理非常重要。
例如,可以在crontab檔案中設定如下形式,忽略日誌輸出:
*/1 * * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
>/dev/null 2>&1
表示先將標準輸出重定向到/dev/null
,然後將標準錯誤重定向到標準輸出。由於標準輸出已經重定向到了/dev/null
,因此標準錯誤也會重定向到/dev/null
,這樣日誌輸出問題就解決了。
3. 其他注意事項
新建立的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron
,則馬上執行。
當crontab
突然失效時,可以嘗試/etc/init.d/crond restart
解決問題。或者檢視日誌看某個job有沒有執行報錯tail -f /var/log/cron
。
千萬別亂執行crontab -r
。它從crontab目錄(/var/spool/cron
)中刪除使用者的crontab檔案。刪除了該使用者的所有crontab,都沒了。
在crontab中%
是有特殊含義的,表示換行
的意思。如果要用的話必須進行轉義\%
,如經常用的date '+%Y%m%d'
在crontab裡是不會執行的,應該換成date '+\%Y\%m\%d'
。
參考
祝玩得開心!ˇˍˇ
雲舒,2019.2.28,杭州