Linux之 計劃任務
介紹
相信每個人都有使用鬧鐘的習慣,我們設定鬧鐘的種類有很多。比如說,只提醒一次、工作日提醒、休息日提醒等。在設定鬧鐘之后,每天的設定時間都會按時的提醒你去做什么事情,以免自己忘記一些重要的會議等事情。像這樣在每天特定的時間安排做一些事情。這樣一種事情我們就稱之為例行任務計劃。 其實在個系統平臺上都有類似的例行性任務計劃功能,那如何去像設定鬧鐘一樣在Linux系統之上指定例行性任務計劃。
Linux的計劃任務是系統管理方面的一個重要內容,是系統自動完成工作的一種實現方式,正因為有了計劃任務,我們才可以完全實現系統管理的腳本化和自動化,提高工作效率。
本文將從以下兩個大方面介紹Linux系統中計劃任務。
- 一次性計劃任務–at命令
- 周期性計劃任務–cron命令
一次性計劃任務–at命令
一次性計劃任務就是根據用戶設定在未來的某個時間點執行一次任務,執行完畢后就結束,本文所有內容皆以CentOS6版本為例。
一、at 命令
# 查詢命令是否已經啟動,at命令依賴于atd服務,包括以下將要介紹的cron的crond服務、anacron服務想要執行相應的計劃任務,對應的服務都要開啟,查看服務是否開啟 service atd status
# 如果命令沒有啟動的話,將其啟動 systemctl start atd
# at主要為以下的幾個文件,接下來會介紹到
/etc/at.deny #at命令的黑名單
/etc/at.allow #at命令的白名單
/etc/rc.d/init.d/atd #at命令的服務名稱
/etc/sysconfig/atd #at的服務
/var/spool/at #計劃任務的暫存目錄
at 命令的設定格式?at [-V] [-q queue] [-f file] [-mMlbv] TIME
options:
-V: 顯示版本信息 -l: 列出隊列中等待運行的作業列表=>等價于atq -d: 刪除指定的作業;相當于atrm -c: 查看具體作業任務 -f /path/from/somefile:從指定的文件中讀取任務 -m:當任務執行完后,向用戶發送郵件,即使沒有標準輸出
TIME 指定任務的開始執行時間
TIME的幾種表達格式
TIME格式: 絕對時間:HH:MM,DD.MM.YY , MM/DD/YY eg :06:06 相對時間:now+# 單位:minutes, hours, days, weeks eg :now+3minutes 模糊時間:noon, midnight, teatime eg : noon
這里說明:作業執行命令的結果中的標準輸出和錯誤以mail通知給安排任務的用戶,如果任務非常多需要考慮定期清理郵件內容,防止垃圾過多影響系統穩定運行
at 命令創建計劃任務
在創建一次性計劃任務時,有多中方法下面列舉出幾種供讀者來比較
交互式創建
交互式定義計劃任務的方式,是最簡單的。
這里說明:交互式定義計劃任務的時候,需要Ctrl+D正常退出命令
舉例說明:
指定時間創建計劃任務 [root@Centos6 ~]#at 06:06
at> echo "hello world"
at> <EOT>
job 1 at 2017-09-01 06:06 使用-l 選項查看計劃任務是否設置成功 [root@Centos6 ~]#at -l 1 2017-09-01 06:06 a root
輸入重定向設定計劃任務
at命令也可以接受重定向,因此我們按照格式直接設定就好
#利用多行重定向
[root@Centos6 ~]#at 06:00 << EOF
> echo "hello world"
> EOF
job 2 at 2017-09-04 06:00
從文件中讀入
與其它許多命令一樣,at也可以接受來自文件的輸入。
#創建一個計劃任務文件
[root@centos6 ~]#cat f1 echo "hello world " echo "hi" 通過-f選項將文件傳給at命令 [root@localhost ~]#at -f f1 05:00
at 命令 白名單 黑名單
- 白名單:/etc/at.allow 默認不存在,只有該文件中定義的用戶才能執行at命令
- 黑名單:/etc/at.deny ?默認存在,拒絕該文件中定義的用戶執行at命令
- 如果兩個文件都不存在,只有 root 可以執行 at 命令,
- 如果兩個文件都存在,則at.deny文件失效,只有at.allow文件中白名單可以執行at命令,不在allow文件中的用戶(除了root),都不能執行at命令。
周期性的計劃任務 cron
? ? cron自身是一個不間斷運行的程序 周期性的計劃任務 分為三種: 系統cron任務,anacron任務,用戶cron anacron 任務: 為cron的補充,能夠實現讓cron因為各種原因在過去的時間該執行而未執行的任務在恢復正常執行一次,適用于經常開機關機的設備,而像大型的服務器大多處于長時間開機的狀態,默認下anacron服務處于關閉狀態。
以下主要介紹:系統cron以及用戶cron
系統的cron
? ? 系統的計劃任務,顧名思義,只有root管理員才能設定的計劃任務,其實普通用戶也能設定計劃任務只是設定的方法有區別,接下來會介紹到系統的cron,定義在/etc/crontab文件中,包含7個字段,我們來看一下/etc/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
# | | | | | .---- username
# | | | | | ????? |
# * * * * * user-name command to be executed 分別表示為:
分鐘 小時 天 月 周 用戶 命令
時間的有效取值:
分鐘:0-59
小時:0-23
天:1-31
月:1-12
周:0-7,0和7都表示周日
注意:
(1) 每一行定義一個周期性任務,共7個字段;
* * * * * : 定義周期性時間
user-name : 運行任務的用戶身份
command to be executed: 任務
(2) 此處的環境變量不同于用戶登錄后獲得的環境,因此,建議命令使用絕對路徑,或者自定義PATH環境變量;
(3) 執行結果郵件發送給MAILTO設定的用戶
在/etc/crontab中時間的表示方法:
時間表示法:
(1) 特定值;
給定時間點有效取值范圍內的值
注意:day of week和day of month一般不同時使用;
(2) *
給定時間點上有效取值范圍內的所有值;表“每..”
(3) 離散取值:
在時間點上使用逗號分隔的多個值; #,#,#
(4) 連續取值:-
在時間點上使用-連接開頭和結束; #-#
(5) 在指定時間點上,定義步長: /#:#即步長;
注意:
(1) 指定的時間點不能被整除時,其意義將不復存在;
(2) 最小時間單位為“分鐘”,想完成“秒”級任務,得需要額外借助于其它機制,例如寫成腳本;
示例:
(1) 3 * * * * :每小時執行一次;每小時的第3分鐘; (2) 3 4 * * 5 :每周執行一次;每周5的4點3分; (3) 5 6 7 * * :每月執行一次;每月的7號的6點5分; (4) 7 8 9 10 * :每年執行一次;每年的10月9號8點7分; (5) 9 8 * * 3,7 :每周三和周日; (6) 0 8,20 * * 3,7 :每周三和周日;8點整和20點整 (7) 0 9-18 * * 1-5 :每周一到周五:9點正到18點正 (8) */5 * * * * :每5分鐘執行一次某任務
這里說明當星期時間和每個月的某天發生沖突時,最終的執行時間為兩者的并集
系統自帶計劃任務命令
系統本身自帶的計劃任務命令,代替了較為簡單的設定,比如每天、每月、每小時等等。
@reboot Run once after reboot. @yearly 0 0 1 1 * @annually 0 0 1 1 * @monthly 0 0 1 * * @weekly 0 0 * * 0 @daily 0 0 * * * @hourly 0 * * * *
cron 命令 白名單 黑名單
cron也有對應的黑白名單設定文件位置為/etc/cron.deny?和?/etc/cron.allow?,關于黑名單和白名單與at命令的使用是一致的。
用戶的cron:
相比系統管理員root設定計劃任務來說,用戶當然也可以設定自己的計劃任務,用戶可以通過命令生成任務文件,也可以直接在對應的目錄下自己編輯文件(不建議)。
用戶創建計劃任務的文件位置:/var/spool/cron/USERNAME,如果用戶創建了cron任務,在/var/spool/cron/ 下面就會生成一個與用戶名一致的臨時文件,里面記錄了需要執行的計劃任務。
crontab命令的格式(兩種)
crontab [-u user] file crontab [-u user] [-l | -r | -e] [-i] [-s] -l: 列出所有任務; -e: 編輯任務; -r: 移除所有任務; -i:同-r一同使用,以交互式模式移除指定任務 -u user: 僅root可運行,指定用戶管理cron任務 file : 從相應文件讀取計劃任務
示例:
用戶創建計劃任務
crontab -u wang -e
查看任務列表
crontab -l
刪除所有任務(交互式)
crontab -r -i
這里說明一下:只有root用戶才能夠指定以哪個普通用戶的身份來創建,在創建完成后被指定的用戶在/etc/spool/cron/下能夠找到與自己用戶同名的任務文件。
anacron 計劃任務 (cron的補充任務)
前面提到過anacron存在的作用,下面只對其進行簡單的介紹,anacron的大致用法與cron差異不大。
anacron 的文件在/etc/anacrontab,我們來看一下
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
# the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45
# the jobs will be started during the following hours only START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly 分為4個字段,每段表示為: 過去有多少天沒有執行 開機后多少分鐘開始執行 描述 命令
這里說明:開機后系統為了防止存在眾多需要執行的計劃任務在同一時間執行,影響系統運行速率,便設定了生成隨機的開機時間,來解決這個問題
到此為止系統的計劃任務已介紹完成,當然還有不足及錯誤之處,望提出指正。 ??
原創文章,作者:M25_ymd,如若轉載,請注明出處:http://www.www58058.com/86236