ubuntu 使用cron設定定時啟動任務
介紹
cron,是一個Linux定時執行工具,可以在無需人工干預的情況下執行作業。
在Ubuntu server 下,cron是被預設安裝並啟動的;如果沒有啟動,自行設定並啟動(chkconfig\sysv-rc-conf)。
通過其配置檔案 /etc/crontab 可以看到以下內容:
ununtu 通過呼叫 run-parts 命令,定時執行四個目錄下的所有指令碼。
1)/etc/cron.hourly,目錄下的指令碼會每個小時讓執行一次,在每小時的17分鐘時執行;
2)/etc/cron.daily,目錄下的指令碼會每天讓執行一次,在每天的6點25分時執行;
3)/etc/cron.weekly,目錄下的指令碼會每週讓執行一次,在每週第七天的6點47分時執行;
4)/etc/cron.mouthly,目錄下的指令碼會每月讓執行一次,在每月1號的6點52分時執行;
當然,以上的時間均是系統預設時間,可以根據自己的需求進行修改。
cron 服務的啟動與停止
cron是被預設安裝並啟動的。而 ubuntu 下啟動,停止與重啟cron,均是通過呼叫/etc/init.d/中的指令碼進行。命令如下
啟動:sudo /etc/init.d/cron start 關閉:sudo /etc/init.d/cron stop
重啟:sudo /etc/init.d/cron restart 重新載入配置:sudo /etc/init.d/cron reload
可以用ps aux | grep cron命令檢視cron是否已啟動
也可以通過如下命令
/usr/sbin/service crond start // 啟動服務
/usr /sbin/service crond stop // 關閉服務
/usr/sbin/service crond restart // 重啟服務
/usr /sbin/service crond reload // 重新載入配置
檢視cron是否在執行
pgrep cron
設定cron執行日誌存放路徑
- 修改rsyslog檔案
sudo vi /etc/rsyslog.d/50-default.conf
將#cron.* 前的 # 刪掉;
- 重啟rsyslog服務
sudo service rsyslog restart
- 重啟cron服務
sudo service cron restart
- 檢視日誌檔案
tail -f /var/log/cron.log
cron 檔案語法
語法如下:
Minute Hour Day Month Dayofweek command
分鐘 小時 天 月 天每星期 命令
每個欄位代表的含義及取值範圍如下:
Minute :分鐘(0-59),表示每個小時的第幾分鐘執行該任務
Hour : 小時(1-23),表示每天的第幾個小時執行該任務
Day : 日期(1-31),表示每月的第幾天執行該任務
Month : 月份(1-12),表示每年的第幾個月執行該任務
DayOfWeek : 星期(0-6,0代表星期天),表示每週的第幾天執行該任務
Command : 指定要執行的命令(如果要執行的命令太多,可以把這些命令寫到一個腳本里面,然後在這裡直接呼叫這個指令碼就可以了,呼叫的時候記得寫出命令的完整路徑)
在這些欄位裡,除了“Command”是每次都必須指定的欄位以外,其它欄位皆為可選欄位,可視需要決定。對於不指定的欄位,要用“*”來填補其位置。同時,cron支援類似正則表示式的書寫,支援如下幾個特殊符號定義:
“ * ” ,代表所有的取值範圍內的數字;
” / “, 代表”每”(“*/5”,表示每5個單位);
” – “, 代表從某個數字到某個數字(“1-4”,表示1-4個單位);
” , “, 分開幾個離散的數字;
段 含義 取值範圍
第一段 代表分鐘 0—59
第二段 代表小時 0—23
第三段 代表日期 1—31
第四段 代表月份 1—12
第五段 代表星期幾,0代表星期日 0—6
舉例如下:
5 * * * * ls // 指定每小時的第5分鐘執行一次ls命令 30 5 * * * ls // 指定每天的 5:30 執行ls命令
30 7 8 * * ls // 指定每月8號的7:30分執行ls命令 50 7 * * * root
run-parts/etc/cron.daily // 每天7:50以root 身份執行/etc/cron.daily目錄中的所有可執行檔案
新增 cron 任務
推薦使用crontab -e命令新增自定義的任務(編輯的是/var/spool/cron下對應使用者的cron檔案,在/var/spool/cron下的crontab檔案 不可以直接建立或者直接修改,crontab檔案是通過crontab命令得到的)。
crontab -e
1)直接執行命令列
每2分鐘列印一個字串“Hello World”,儲存至檔案/home/laigw/cron/HelloWorld.txt中,cron 格式如下:
/2 * * * echo “Hello World.” >> /home/HelloWorld.txt
2)shell 檔案
每3分鐘呼叫一次 /home/laigw/cron/test.sh 檔案,cron 格式如下:
/3 * * * /home/laigw/cron/test.sh
檔案 /home/laigw/cron/test.sh 的內容如下:
———————————————————————————————————————–
1
2
3
!/bin/sh
cd /home/laigw/cron
echo “shell” >> shell.txt
———————————————————————————————————————–
3)php 檔案
php 檔案需要增加命令列 “#!/usr/local/php/bin/php”,其 “/usr/local/php/bin/php” 的意思是,需要引入PHP程式安裝目錄下的/bin/php 檔案(該ubuntu系統中,PHP程式的安裝目錄是/usr/local/php),而這種引入檔案的處理方式有兩種。
a. 在 php 檔案中引入命令列(推薦使用),cron 的格式如下:
/1 * * * /home/laigw/cron/test.php
檔案 /home/laigw/cron/test.php 的內容如下:
———————————————————————————————————————–
1
!/usr/local/php/bin/php
———————————————————————————————————————–
注: 需要把test.php檔案賦予可執行許可權:# chmod +x test.php
b. 在寫 cron 任務時引入命令列,cron 的格式如下:
/1 * * * /usr/local/php/bin/php /home/laigw/cron/test.php
檔案 /home/laigw/cron/test.php 的內容如下:
———————————————————————————————————————–
———————————————————————————————————————–
注: 需要把test.php檔案賦予可執行許可權:# chmod +x test.php
5. 其他
/var/spool/cron/ 該目錄下存放所有使用者的cron服務
/var/log/cron 記錄cron執行的日誌資訊
6. 一個超級使用者的 crontab
1
2
3
4
5
Run the ‘atrun’ program every minutes
#This runs anything that’s due to run from ‘at’.See man ‘at’ or ‘atrun’.
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun
40 7 * * * updatedb
8,10,22,30,39,46,54,58 * * * * /bin/sync
7. 例子
●30 5 * * * root /sbin/init 6 這樣就將系統配置為了每天早上5點30自動重新啟動。
● 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命令
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 替換為 >>
如果使用sh指令碼還需修改sh指令碼的許可權 chmod +x /…/…/test.sh