Linux | 定時任務
有時候因為業務需要,服務白天不能停機,但是還需要更新服務,所以只能等到凌晨兩點的時候去執行指令碼,去更新服務。所以這個時候定時任務就有用處了,可以寫一個指令碼,在指定的時間段,啟動或者停止某個服務,這就實現了簡單的伺服器自動化運維。
定時任務分為一次性定時任務 & 週期性定時任務:
- 一次性定時任務:今天晚上的 2:30 執行 test.sh指令碼。
- 週期性定時任務:每天晚上的 2:30 都執行test.sh指令碼。
一次性定時任務
顧名思意,一次性定時任務只執行一次,一般用於臨時的工作需要。
格式:
# 第一種方法
at 時間
> 輸入要執行的內容。
# 第二種方法
要執行的命令 | at 時間
以上兩種方法都行
我經常用的還是第二種,因為只需要一行就可以搞定一個簡單的一次性定時任務。
例如:
echo "hello world" | at 14:25
這種方法,可以以非互動式的方式建立一個Linux任務。
可以使用at -l
命令查詢建立的所有一次性定時任務:
像上面一樣,我一不小心,在 15:00 的時候,建立了兩個任務,這時,我可以用:atrm 定時任務的序列號
刪除任務。
週期性定時任務
檢查 crontab 服務是否安裝
rpm -qa | grep crontab
因為這個軟體是系統預設自帶的,所以大部分系統都會有這個應用。如果沒有,請使用: yum -y install crontab
進行安裝。
檢查 crontab 服務是否開啟
/etc/init.d/crond start # 啟動服務
/etc/init.d/crond stop # 關閉服務
/etc/init.d/crond restart # 重啟服務
/etc/init.d/crond reload # 重新載入服務
加入開機啟動:
chkconfig --level 35 crond on
crontab 配置檔案
crontab
以分為全域性和使用者個人的配置檔案,全說全域性的配置檔案:
全域性配置
全域性的配置檔案全在 /etc/
目錄下面:
配置檔案跟據字尾名不一樣,可以分為:每天,每週,每月,每小時
cron.d
是系統自己的定時任務配置檔案
cron.deny
是用於控制不讓哪些使用者使用的 crontabl 功能
crontab
配置檔案是使用者可以自定義定時任務的全域性配置檔案
我們著重看一下:crontab 檔案:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
# 分 日 天 月 星期 命令
前面三行是服務定義的變數,註釋下面才是我們新增定時任務的地方。
* 號代表不做限制,比如說,如果分鐘欄位是 * 號,那麼這個任務,每分鐘都執行。
, 逗號代表分隔時間段的意思,如果一天內,只有 3,5,7 這個時間段執行這個任務那麼:3,5,7
- 程式碼範圍取值,當一個任務白天執行,晚上不執行的時候,可以這樣寫:[7-18]
/ 代表時間的間隔頻率,比如 `*/10 * * * * 命令` 就是每過10 分鐘執行一次。
個人配置
每個使用者都有一個自己的定時任務配置,並且這個配置不和全域性配置衝突,這個檔案的位置在:/var/spool/cron/
下面。
我們可以在這裡修改自己的定時任務,也可以通過命令管理自己的定時任務:
crontab -l # 檢視定時任務
crontab -e # 編輯定時任務
當使用 crontab -e
命令的時候,相當於編輯 /var/spool/cron/
下面自己的定時任務檔案一樣。
系統會每分鐘掃描一次這個檔案,所以這個定時任務的生效時間是下一分鐘。
例子
每天早上6點
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意單純echo,從螢幕上看不到任何輸出,因為cron把任何輸出都email到root的信箱了。
每兩個小時
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11點到早上8點之間每兩個小時和早上八點
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點
0 11 4 * 1-3 command line
1月1日早上4點
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出現錯誤,或者有資料輸出,資料作為郵件發給這個帳號 HOME=/
每小時執行/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"這個引數了,如果去掉這個引數的話,後面就可以寫要執行的某個指令碼名,而不是資料夾名。
每天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。
5,15,25,35,45,55 16,17,18 * * * command
每週一,三,五的下午3:00系統進入維護狀態,重新啟動系統。
00 15 * * 1,3,5 shutdown -r +5
每小時的10分,40分執行使用者目錄下的innd/bbslin這個指令:
10,40 * * * * innd/bbslink
每小時的1分執行使用者目錄下的bin/account這個指令:
1 * * * * bin/account
每天早晨三點二十分執行使用者目錄下如下所示的兩個指令(每個指令以;分隔):
20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)
細節決定成敗!
個人愚見,如有不對,懇請扶正!