簡介
crontab用於設置周期性被執行的命令
Linux系統中Linux調動工作分為兩大類:
1、系統執行的工作:系統周期性所要執行的工作,如備份系統數據、清理緩存
2、個人執行的工作:某個用戶定期要做的工作,例如每隔10分鍾檢查郵件服務器是否有新信,這些工作可由每個用戶自行設置
/etc/crtontab
系統調度的任務一般存放在/etc/crontab這個文件下,里面存放了一些系統運行的調度程序,通過命令cat crontab查看
這些任務會在系統運行起來自動調用
/var/spool/cron
每個用戶都會生成自動生成一個自己的crontab文件,一般位於/var/spool/cron目錄下
執行命令crontab -r 就會刪除當前用戶的crontab文件。例如你切換到suifeng賬號下,執行了該命令,那么/var/spool/cron/suifeng文件就會刪除,如果要創建該文件只需要用crontab -e命令即可。
注意,普通用戶一般沒有權限訪問/var/spool/cron
/etc/crontab.deny文件與/etc/crontab.allow文件
1、分別表示不能使用crontab命令的用戶、以及能夠使用crontab命令的用戶
2、兩個文件同時存在crontab.allow文件優先
3、兩個文件都不存在則只有root用戶才擁有調用該命令
語法
crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]
各個參數說明
- -e [UserName]: 執行文字編輯器來設定時程表,內定的文字編輯器是 vi(可以指定別的用戶,但是必須擁有權限)
- -r [UserName]: 刪除目前的時程表
- -l [UserName]: 列出目前的時程表
- -v [UserName]:列出用戶cron作業的狀態
創建定時任務
crontab -e進入文本(vi)編輯狀態 * * * * * command path // 前五個字段可以取整數值,指定何時開始工作,第六個域是字符串,即命令字段,其中包括了crontab調度執行的命令。 各個字段之間用spaces和tabs分割。
(可將命令寫入.sh腳本文件中,並賦予可執行的權限即可)
調度命令的規則
| 字段名稱 | 說明 | 取值范圍 |
| 分鍾 | 每小時的第幾分鍾執行 | 0-59 |
| 小時 | 每日的第幾個小時執行 | 0-23 |
| 日期 | 每月的第幾天執行 | 1-31 |
| 月歷 | 每年的第幾月執行 | 1-12 |
| 星期 | 每周的第幾天執行 | 0-6 |
| 命令名稱 | 欲執行的命令及參數 |
crontab命令中的一些常用特殊符號
| 符號 | 說明 |
| * | 表示任何時刻 |
| , | 表示分割 |
| - | 表示一個段,如第二段里: 1-5,就表示1到5點 |
| /n | 表示每個n的單位執行一次,如第二段里,*/1, 就表示每隔1個小時執行一次命令。也可以寫成1-23/1. |
查看定時任務
crontab -l
刪除定時任務
crontab -r
使用示例
實例1:每1分鍾執行一次command
* * * * * command
實例2:每小時的第3和第15分鍾執行
3,15 * * * * command
實例3:在上午8點到11點的第3和第15分鍾執行
3,15 8-11 * * * command
實例4:每隔兩天的上午8點到11點的第3和第15分鍾執行
3,15 8-11 */2 * * command
實例5:每個星期一的上午8點到11點的第3和第15分鍾執行
3,15 8-11 * * 1 command
實例6:每晚的21:30重啟smb
30 21 * * * /etc/init.d/smb restart
實例7:每月1、10、22日的4 : 45重啟smb
45 4 1,10,22 * * /etc/init.d/smb restart
實例8:每周六、周日的1 : 10重啟smb
10 1 * * 6,0 /etc/init.d/smb restart
實例9:每天18 : 00至23 : 00之間每隔30分鍾重啟smb
0,30 18-23 * * * /etc/init.d/smb restart
實例10:每星期六的晚上11 : 00 pm重啟smb
0 23 * * 6 /etc/init.d/smb restart
實例11:每一小時重啟smb
* */1 * * * /etc/init.d/smb restart
實例12:晚上11點到早上7點之間,每隔一小時重啟smb
* 23-7/1 * * * /etc/init.d/smb restart
實例13:每月的4號與每周一到周三的11點重啟smb
0 11 4 * mon-wed /etc/init.d/smb restart
實例14:一月一號的4點重啟smb
0 4 1 jan * /etc/init.d/smb restart
實例15:每小時執行/etc/cron.hourly目錄內的腳本
01 * * * * root run-parts /etc/cron.hourly # run-parts這個參數了,如果去掉這個參數的話,后面就可以寫要運行的某個腳本名,而不是目錄名
實例16:
1、每天23點59分后台執行test.sh腳本;並將標准輸出寫入log.txt中
59 23 * * * /home/suifeng/scripts/test.sh >/home/suifeng/log.txt &
2、同上
59 23 * * * /home/suifeng/scripts/test.sh 1>/home/suifeng/log.txt &
3、每天23點59分后台執行test.sh腳本;並將錯誤輸出寫書log.txt中
59 23 * * * /home/suifeng/scripts/test.sh 1>/home/suifeng/log.txt &
4、每天23點59分后台執行test.sh腳本;並將錯誤輸錯當做標准輸出(即將錯誤輸出和標准輸出全部寫入log.txt中)
59 23 * * * /home/suifeng/scripts/test.sh 1>/home/suifeng/log.txt 2>&1 &
相關說明
0表示鍵盤輸入
1表示標准輸出
2表示錯誤輸出
&表示后台執行
>>表示追加
>表示覆蓋寫
注意
1、當在前台運行某個作業時,終端被該作業占據;而在后台運行作業時,它不會占據終端。可以使用&命令把作業放到后台執行。
2、需要用戶交互的命令不要放在后台執行,因為那樣子機器將會在那一直等待
3、作業在后台運行時,一樣會將結果輸出在屏幕上,干擾你的正常工作。因此我們最好將輸出重定向到某個文件中
crond服務
通過 chkconfig --list | grep cron 命令來查看cron服務的啟動情況:
[root@***** home]# chkconfig --list | grep cron crond 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
我們可以看到,系統啟動級別如果是1-4,cron服務都會開機自動啟動的,我們可以通過如下命令來設置該服務的啟動項:
/sbin/service crond start /sbin/service crond stop /sbin/service crond restart /sbin/service crond reload
以上1-4行分別為啟動、停止、重啟服務和重新加載配置。
要把cron設為在開機的時候自動啟動,在 /etc/rc.d/rc.local 腳本中加入 /sbin/service crond start 即可。
查看crontab服務狀態:
service crond status
操作實例
1.首先,新建需要定時執行的shell腳本,這里我為了方便說明問題,新建了一個打印當前時間的腳本date.sh,內容如下,非常簡單,就是一行date命令,然后將輸出重定向到一個date.txt文本中:

2.接着就是將這個date.sh腳本添加到定時任務中,直接運行“crontab -e”命令添加就行,如下,這里先以每分鍾執行一次腳本為例,看定時任務能否正常執行,編輯“*/1 * * * * /root/date.sh”保存就行,如下:

至於這6個字段的含義,官方文檔有詳細說明,如下,分別代表分、時、天、月、星期和執行的命令,網上介紹資料也非常豐富,感興趣的話,可以搜索一下:

3.最后,我們再查看一下輸出文件date.txt和crontab日志,如下,說明添加的定時任務已經正常運行,這里再替換成你每天定時執行的時間,只需要修改第一、二個字段就行,例如,每天10:30執行,則編輯“30 10 * * * /root/date.sh”保存就行:

至此,我們就完成了每天定時執行shell腳本。總的來說,整個過程非常簡單,只要你有一定的Linux基礎,熟悉一下crontab命令,很快就能掌握的,網上也有相關資料和教程,介紹的非常詳細,感興趣的話,可以搜一下,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言進行補充。
個人經驗總結
我們使用這個命令大多都是運行相關的腳本文件,最常見的就是定時調用http請求進行數據采集或者數據庫的備份等等。因此當我們自己所寫的腳本文件中含有文件引入時,最好采用絕對路徑,否則將會引入失敗從而導致定時任務失敗。
