這是慕課網(wǎng)《Linux中的計(jì)劃任務(wù)之Crontab》的學(xué)習(xí)記錄幔虏,方便以后查閱进泼。
從定時(shí)重復(fù)的工作中解脫出來(lái)
1. Crontab 是什么撵儿?
Crontab 是一個(gè)用于設(shè)置周期性被執(zhí)行的任務(wù)的工具渤闷。
- Cron Job:被周期性執(zhí)行的任務(wù)
- Cron Table:周期性執(zhí)行的任務(wù)列表
2. 安裝并檢查Crontab服務(wù)
- 檢查Crontab工具是否安裝:
crontab -l
- 檢查crond 服務(wù)是否啟動(dòng):
service crond status
- 安裝cron
CentOS
yum install vixie-cron
yum install crontabs
Ubuntu
sudo apt-get update
sudo apt-get install cron
3. 簡(jiǎn)單示例
crontab -e 進(jìn)入編輯模式
添加一行
*/1 * * * * date >> /tmp/date.log
每分鐘將當(dāng)前日期時(shí)間寫入日志文件
tail -f /tmp/date.log (動(dòng)態(tài)刷新)
tail -3 /tmp/date.log (顯示最后3行)
4. Crontab 的基本組成
- 配置文件:文件方式設(shè)置定時(shí)任務(wù)
- 系統(tǒng)服務(wù)CROND:每分鐘都會(huì)從配置文件刷新定時(shí)任務(wù)甘晤、執(zhí)行定時(shí)任務(wù)
- 配置工具crontab:調(diào)整定時(shí)任務(wù)
1. 配置文件格式
分鐘0-59
小時(shí)0-23
日期1-31
月份1-12
星期0-7(0和7都表示星期日)
示例:
每晚21:30重啟apache
30 21 * * * service httpd restart
每月1含潘、10、22號(hào)4:34重啟apache(離散)
34 4 1,10,22 * * service httpd restart
每月1-10號(hào)4:34重啟apache (連續(xù))
34 4 1-22 * * service httpd restart
每2分鐘重啟apache
*/2 * * * * service httpd restart (偶數(shù)分鐘)
1-59/2 * * * * service httpd restart (奇數(shù)分鐘)
晚上11點(diǎn)到早晨7點(diǎn)重啟apache
0 23-7/1 * * * service httpd restart (分鐘要指定)
晚上11點(diǎn)到早晨7點(diǎn)每隔30分鐘重啟apache
0,30 23-7/1 * * * service httpd restart
0-59/30 23-7/1 * * * service httpd restart
小結(jié):
- * 表示任何時(shí)候都匹配线婚。
- 可以用"A,B,C" 表示A或者B或者C時(shí)執(zhí)行命令
- 可以用"A-B"表示A到B之間時(shí)執(zhí)行命令
- 可以用"*/A"表示每A分鐘(小時(shí)等)執(zhí)行一次命令
5. Crontab 工具的使用
crontab -help
crontab -l
crontab -e
crontab -e -u cron
tail -f /var/log/cron 查看計(jì)劃任務(wù)的執(zhí)行情況
如果沒(méi)有指定用戶遏弱,顯示的就是當(dāng)前登錄用戶自己的計(jì)劃任務(wù)。
6. Crontab 配置文件
位于 /etc/crontab
目錄下
crontab 在載入配置文件的時(shí)候塞弊,會(huì)把cron.d 下面的sysstat文件里面的配置信息載入成為root用戶的計(jì)劃任務(wù)漱逸。
crontab -l/-e 不能查看和編輯系統(tǒng)級(jí)的計(jì)劃任務(wù)泪姨,即 cron.d 目錄下的文件,需要 cd 到該目錄使用vi編輯饰抒。
crontab -l/-e 其實(shí)是操作的 /var/spool/cron/username 文件
7. 修改Crontab的默認(rèn)編輯器為vi
在root的配置文件 .profile (/root/.profile)添加以下代碼
EDITOR=vi; export EDITOR
然后肮砾,載入這個(gè)文件即可
source .profile
8. 幾個(gè)坑
1. 環(huán)境變量
.bash_profile 中設(shè)置的環(huán)境變量并不會(huì)被Crontab捕獲。
2. 第三和第五個(gè)域之間執(zhí)行的是“或”操作
如四月第一個(gè)星期日早晨6:30執(zhí)行腳本
30 6 1-7 4 0 /root/a.sh
上面寫法的結(jié)果是:四月第一個(gè)星期的周一到周日(7次)或周日(一個(gè)月最少4次)早晨執(zhí)行循集,總執(zhí)行次數(shù)為10或11唇敞,并不是我們希望的結(jié)果。
30 6 1-7 4 * test `date +\%w` -eq 0 && /root/a.sh
date +%w 輸出當(dāng)前的星期咒彤,0-6
test 表示是否成功
echo $? 輸出上一個(gè)命令成功與否疆柔,1表示失敗,0表示成功
避免使用等號(hào)(用的話前后都加空格)進(jìn)行判斷镶柱,使用 -eq
&& 表示前面成功(0)后面才執(zhí)行
% 在計(jì)劃任務(wù)中要進(jìn)行轉(zhuǎn)義
3. 分鐘設(shè)置
* 表示所有都匹配旷档,所以每小時(shí),每天這樣的情況要給小一級(jí)的單位設(shè)置一個(gè)默認(rèn)值歇拆。
0 */2 * * * date
9. 綜合案例
每30s執(zhí)行一次
*/1 * * * * echo "1111"
*/1 * * * * sleep 30s; echo "1111" (分號(hào)表示無(wú)論前面的命令是否成功鞋屈,后面都會(huì)執(zhí)行)