cron來源於希臘單詞chronos(意爲“時間”),是linux系統下一個自動執行指定任務的程序。例如,你想在每晚睡覺期間創建某些文件或文件夾的備份,就可以用cron來自動執行。
服務的啓動和停止
cron服務是linux的內置服務,但它不會開機自動啓動。可以用以下命令啓動和停止服務:
- /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
即可。
查看、編輯和刪除
cron把命令行保存在crontab(cron table)文件裏,這個文件通常在 /etc 目錄下。每個系統用戶都可以有自己的crontab(在 /var/spool/cron/ 下)。
- file 使用file文件的內容作爲某個用戶的cron服務配置,內容會複製到cron服務的配置文件中
- -u 設定某個用戶的cron服務配置,一般root 用戶在執行這個命令的時候需要此參數
- -l 列出某個用戶cron服務配置
- -r 刪除某個用戶的cron服務配置
- -e 編輯某個用戶的cron服務配置,當指定crontab 不存在時新建,將使用vi打開配置文件進行編輯保存後退出,文件語法見後
- crontab –v 顯示上一次編輯的時間(只在某些操作系統上可用)
如當前是root身份,要查看/編輯/刪除/某用戶的crontab,只需在相應的命令後加上 -u USERNAME (如 crontab -e -u USERNAME )即可。
crontab文件的默認編輯器是vi,可以輸入 export VISUAL='editor' 更改默認編輯器。
cron服務每分鐘不僅要讀一次 /var/spool/cron 目錄內的所有文件,還需要讀一次 /etc/crontab 文件。配置這個文件也能讓cron執行任務。使用crontab命令是對用戶級任務的配置,而編輯 /etc/crontab 文件是對系統級任務的配置。
語法說明
每行表示一個指令,即表示一項計劃任務;每行由空格分隔的六個部分組成,前5部分表示定時任務的執行時間,剩餘部分爲定時任務要執行的命令,格式如下:
分 小時 日 月 星期 命令
Minute Hour Day Month DayOfWeek command
- Minute 每個小時的第幾分鐘執行該任務,0-59
- Hour 每天的第幾個小時執行該任務,0-23
- Day 每月的第幾天執行該任務,1-31
- Month 每年的第幾個月執行該任務,1-12
- DayOfWeek 每週的第幾天執行該任務,0-6,0表示週日
- Command 指定要執行的程序
以上前五項可使用以下四個特殊符號:
- * 表示所有數值,如第一位使用* 表示每分鐘
- / 表示每,如第一位使用 */5 表示每5分鐘
- - 表示數值範圍,如第二位使用2-4表示2點到4點
- , 表示離散的多個數值,如第2位使用6,8 表示6點和8點
- 指定“步長”:8-14/2 表示8,10,12,14
- 指定列表:比如 “1,2,3,4″,”0-4,8-12″
在每行的六項字段中,除了Command是每次都必須指定的字段以外,其它字段皆爲可選字段,可視需要決定。對於不指定的字段,要用“*”來填補其位置。
1)除去前五段,從第六段開始到換行符或者“%”爲止,爲要執行的命令。
2)默認第六段將被/bin/sh執行,除非在crontab文件中指定了非/bin/sh的SHELL變量。
3)第六段中的”%”號,除非前面加”\”號轉交,否則,“%”號將結束命令行、換行的意義,並且其後的內容會被做爲標準輸入發送給前面的命令。
舉例如下:
- Every minute (* * * * *)
- Every 5 minutes (*/5 * * * *)
- Twice an hour (0,30 * * * *)
- Once an hour (0 * * * *)
- Twice a day (0 0,12 * * *)
- Once a day (0 0 * * *)
- Once a week (0 0 * * 0)
- 1st and 15th (0 0 1,15 * *)
- Once a month (0 0 1 * *)
- Once a year (0 0 1 1 *)
- 5 * * * * ls > /var/log.txt 指定每小時的第5分鐘執行一次ls命令,並將結果保存到/var/log.txt文件
- 30 5 * * * ls 指定每天的 5:30 執行ls命令
- 30 7 8 * * ls 指定每月8號的7:30分執行ls命令
- 30 5 8 6 * ls 指定每年的6月8日5:30執行ls命令
- 30 6 * * 0 ls 指定每星期日的6:30執行ls命令 [注:0表示星期天,1表示星期1,以此類推,也可以用英文來表示,sun表示星期天,mon表示星期一等。]
- 30 3 10,20 * * ls 每月10號及20號的3:30執行ls命令 [注:“,”用來連接多個不連續的時段]
- 25 8-11 * * * ls 每天8-11點的第25分鐘執行ls命令 [注:“-”用來連接連續的時段]
- */15 * * * * ls 每15分鐘執行一次ls命令 [即每個小時的第0 15 30 45 60分鐘執行ls命令]
- 30 6 */10 * * ls 每個月中,每隔10天6:30執行一次ls命令[即每月的1、11、21、31日是的6:30執行一次ls命令。]
cron配置文件
使用crontab命令添加完成計劃任務後會在/var/spool/cron目錄中生成一個用戶名字的文件,文件裏面就是你的計劃任務,cron服務會每分鐘讀取一次/var/spool/cron 中的文件。
系統計劃任務
還有一種方法可以添加計劃任務,編輯/etc/crontab (cron服務每分鐘也讀取一次/etc/crontab文件。
用crontab配置是針對某個用戶的,而編輯/etc/crontab是針對系統的任務。此文件的文件格式是:
- SHELL=/bin/bash
- PATH=/sbin:/bin:/usr/sbin:/usr/bin
- MAILTO=root //如果出現錯誤,或者有數據輸出,數據作爲郵件發給這個帳號
- HOME=/ //使用者運行的路徑,這裏是根目錄
- # run-parts
- #每小時執行/etc/cron.hourly內的腳本
- 01 * * * * root run-parts /etc/cron.hourly
- #每天執行/etc/cron.daily內的腳本
- 02 4 * * * root run-parts /etc/cron.daily
- #每星期執行/etc/cron.weekly內的腳本
- 22 4 * * 0 root run-parts /etc/cron.weekly
- #每月去執行/etc/cron.monthly內的腳本
- 42 4 1 * * root run-parts /etc/cron.monthly
注意”run-parts”這個參數,如果去掉這個參數的話,後面就要寫要運行的某個腳本名,而不是文件夾名。例如:11 2 21 10 * rm -rf /mnt/fb
以下是兩個cron語句的例子(在 /etc/crontab 文件裏)。前者用來晚間備份 /etc 目錄,後者運行Analog程序處理服務器的統計信息。
- 12 3 * * * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
- 52 5 * * * root /usr/local/src/analog-5.32-lh/analog >> /dev/null 2>&1
以下是cron語句中的字段與字段說明:
字段 | 說明 |
1 | 分鐘(0-59) |
2 | 小時(0-23) |
3 | 日期(1-31) |
4 | 月份(1-12;或英文縮寫Jan、Feb等) |
5 | 周幾(0-6,0爲週日;或單詞縮寫Sun、Mon等) |
6 | 用戶名(執行命令時以此用戶的身份) |
7 | 要執行的命令(路徑) |
現在來看第一行:
- 12 3 * * * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
這條語句將在每天的凌晨3點12分 (03:12)運行 tar czf /usr/local/backups/daily/etc.tar.gz /etc
命令。>> /dev/null 2>&1
表示把所有標準輸出發送到 /dev/null(linux的回收站),把標準錯誤輸出(2)發送到和標準輸出(1)同樣的地方(即 /dev/null)。運行這行命令將不會產生任何輸出。
這條語句可以變得稍微複雜一點:
- 30 15 13 6 1 * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
它將在6月13日週一的15:30 運行 tar czf /usr/local/backups/daily/etc.tar.gz /etc
命令。
以下語句可以達到同樣的效果:
- 30 15 13 Jun Mon * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
如果你想以用戶joey的身份每小時的第15分鐘 運行某個程序,可以使用:
- 15 * * * * joey /usr/bin/somecommand >> /dev/null 2>&1
其中的星號(*)是通配符,表示cron將忽略這個字段。
如果你想每兩小時 就運行某個程序,可以在小時字段裏使用 */2
。它將會在2點,4點,6點……22點,24點運行。具體語句如下:
- 0 */2 * * * joey /usr/bin/somecommand >> /dev/null 2>&1
cron語句中還可以使用逗號(,)來指定多個時間。例如你想在每小時的15分和30分 運行某個程序,可以在分鐘字段使用 15,30
:
- 15,30 * * * * joey /usr/bin/somecommand >> /dev/null 2>&1
如果你想在每月的第一週(即1號到7號)每天的指定時間 運行某個程序,可以在日期字段使用 1-7
:
- 15,30 */2 1-7 * * joey /usr/bin/somecommand >> /dev/null 2>&1
這條語句將在每月的第1-7日每兩小時的15分和30分 (02:15,02:30……22: 15,22:30等)運行/usr/bin/somecommand
命令。
如果你想在每天的16:18 執行一個腳本集合,可以把所有要執行的腳本放到一個目錄中(如 /home/username/cron),可以使用:
- 18 16 * * * root run-parts /home/username/cron >> /dev/null 2>&1
如果你想保存某個程序的輸出結果, 可以把 >> /dev/null 2>&1
替換爲>> /home/user/somecommand.log 2>&1
。
總結
- 查看當前用戶的cron配置,使用 crontab -l
- 編輯當前用戶的cron配置,使用 crontab -e
- 刪除當前用戶的cron配置,使用 crontab -r
- 刪除計時器設置時要先詢問,使用 crontab -i 交互式模式
- 以root身份查看/編輯/刪除某用戶的cron配置,在命令後加上 -u USERNAME
- 配置系統級的任務,編輯 /etc/crontab 文件
ubuntu 重設crontab -e的默認編輯器
- sudo select-editor
On Gnome-based Ubuntu systems Gnome Scheduled tasks tool (from the gnome-schedule package) inApplications --> System Tools provides a graphical interface with prompting for using Cron. The project website is at http://gnome-schedule.sourceforge.net/; the software is installable from the Software Center or by typing
- sudo apt-get install gnome-schedule
in a terminal.
來源: https://help.ubuntu.com/community/CronHowto
- [root@localhost ~]# crontab -l #查看定時運行的程序
- 59 23 * * * /bin/sh /var/www/database/bak.sh
- 59 3 * * * /bin/sh /var/www/database/mylinux.sh
- 59 5 * * 0 /sbin/reboot