一、簡介
Linux系統任務是由 cron (crond) 這個系統服務來控制的,這個系統服務是預設啟動的。crond 指令每分锺會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。使用者自己設定的計劃任務則使用crontab 指令。
二、Crontab配置
在CentOS系統中,
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
可以看到 建立一個定時任務 需要指定:
cron表達式 指定使用者(可省略) 具體執行任務
用基礎的 排程器、觸發器、執行器來劃分:
crontab程式本身是排程器,
在配置檔案中配的cron表達式是觸發器,
在配置檔案中配置的具體執行任務是執行器。
crontab文法
crontab [ -u user ] file
或者
crontab [ -u user ] { -l | -r | -e }
注:如果不使用 -u user 的話,就是表示設定自己的時程表。
-e : 執行文字編輯器來設定時程表(最常用)
-r : 删除目前的時程表
-l : 列出目前的時程表
舉例:
0 */2 * * * /sbin/service httpd restart 意思是每兩個小時重新開機一次apache
50 7 * * * /sbin/service sshd start 意思是每天7:50開啟ssh服務
50 22 * * * /sbin/service sshd stop 意思是每天22:50關閉ssh服務
0 0 1,15 * * fsck /home 每月1号和15号檢查/home 磁盤
1 * * * * /home/bruce/backup 每小時的第一分執行 /home/bruce/backup這個檔案
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; 每周一至周五3點鐘,在目錄/home中,查找檔案名為*.xxx的檔案,并删除4天前的檔案。
30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30執行一次ls指令
指令:
service crond start //啟動服務
service crond stop //關閉服務
service crond restart //重新開機服務
service crond reload //重新載入配置
三、特殊事項:
- crontab有2種編輯方式:直接編輯/etc/crontab檔案與crontab –e,其中/etc/crontab裡的計劃任務是系統中的計劃任務,而使用者的計劃任務需要通過crontab –e來編輯;
- 每次編輯完某個使用者的cron設定後,cron自動在/var/spool/cron下生成一個與此使用者同名的檔案,此使用者的cron資訊都記錄在這個檔案中,這個檔案是不可以直接編輯的,隻可以用crontab -e 來編輯。
- crontab中的command盡量使用絕對路徑,否則會經常因為路徑錯誤導緻任務無法執行。
- 新建立的cron job不會馬上執行,至少要等2分鐘才能執行,可從起cron來立即執行。
- %在crontab檔案中表示“換行”,是以假如腳本或指令含有%,需要使用\%來進行轉義。
- 腳本無法執行問題
如果我們使用 crontab 來定時執行腳本,無法執行,但是如果直接通過指令(如:./test.sh)又可 以正常執行,這主要是因為無法讀取環境變量的原因。
解決方法:
所有指令需要寫成絕對路徑形式,如: /usr/local/bin/docker。
在 shell 腳本開頭使用以下代碼:
#!/bin/sh
. /etc/profile
. ~/.bash_profile
3、在 /etc/crontab 中添加環境變量,在可執行指令之前添加指令 . /etc/profile;/bin/sh,使得環境變量生效,例如:
20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh
四、适應場景:
Liunx的定時任務适合進行一些非業務的操作,比如簡單的檢測業務系統是否異常,定時清除一些系統備援資料,檢查系統情況等。在Liunx定時中不建議放特别複雜的邏輯。