linux計劃任務、周期性任務執行
未來的某時間點執行一次某任務:at,batch
周期性運行某任務:crontab
執行結果: 會通過郵件發送給用戶, 存放在/var/spool/mail/UserName
~]# ss -tnl 或者 ~]# netstat -tnlp 查看是否有25號端口打開,來判斷本機的郵件服務是否正常打開
本地電子郵件服務:
smtp協議: simple mail transmission protocol,簡單郵件傳遞協議
pop3: post office protocol
imap4: internet mail access protocol
mail命令:
mailx – send and receive Internet mail (CentOS 7)
MUA: Mail User Agent, 用戶收發郵件的工具程序
mailx [-s 'SUBJECT(標題)'] UserName[@hostname]
郵件正文的生成:
(1) 交互式輸入, . 單獨成行可以表示正文結束, ctrl + d提交亦可
(2) 通過輸入重定向
(3) 通過管道
at 命令
需要atd服務啟動
/var/spool/at
at [option]… [TIME]
TIME:
HH:MM[YYYY-mm-dd]
noon: 中午
midnight: 午夜
teatime: 下午4點
tomorrow: 明天
now + #: 指定從現在延遲多久后執行作業任務
UNIT(單位): minutes, hours, days, weeks
at的作業有隊列, 用單個字母表示, 默認都使用a隊列
常用選項:
-l: 查看作業隊列, 相當于atq
-f /Path/From/File: 從文件中讀取作業任務, 而不用再交互式輸入
-d #: 刪除指定號碼的任務, 相當于atrm #
-c #: 查看指定號碼的作業的具體內容
-q QUEUE: 指明隊列
注意: 作業的執行結果是以郵件發送給提交作業的用戶
/etc/at.allow文件比/etc/at.deny文件的優先級高
batch 命令
batch會讓系統自行選擇在系統資源較空閑的時間去執行指定的任務
周期性任務計劃: cron
/var/spool/cron/username
需要服務程序始終處于運行狀態:
cronie: 主程序包, 提供了crond守護進程及相關輔助工具
/etc/cron.allow和 /etc/cron.deny
確保crond守護進程(daemon)處于運行狀態;
CentOS 7: systemctl status crond.service
CentOS 6: service crond status
向crond提交作業的方式不同于at, 需要使用專用的配置文件, 并且此文件有固定格式, 不建議使用文本編輯器直接編輯此文件, 要使用crontab命令
crond任務分為兩類
系統crond任務: 主要用于實現系統自身的維護
手動編輯: /etc/crontab 文件
用戶crond任務:
命令: crontab 命令
系統cron的配置格式:
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
注意:
(1)每一行定義一個周期性任務, 共七個字段
* * * * *: 定義周期性時間
user-name: 運行任務的用戶的身份
command to be executed: 要執行的任務
(2)此處的環境變量不同于用戶登錄后獲得的環境變量, 因此, 建議命令使用決定路徑, 或者自定義環境變量PATH
(3) 執行結果郵件發送給MAILTO指定的用戶
用戶crond的配置格式
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
# | | | | |
# * * * * * command to be executed
注意:
(1) 每行定義一個cron任務, 共6個字段, 沒有用戶名
(2)此處的環境變量不同于用戶登錄后獲得的環境變量, 因此, 建議命令使用決定路徑, 或者自定義環境變量PATH
(3) 郵件發送給當前用戶
時間表示法:
(1) 特定值
給定時間點有效取值范圍內的值;
注意: day of week和day of month一般不同時使用
(2) *
給定時間點上有效取值范圍內的所有值; 表示"每…"
(3) 離散取值: ,
在時間點上使用逗號分隔的多個值
#,#,#
(4) 連續取值: –
在時間上使用 – 連接開頭和結束
#-#
(5) 在指定時間點上, 定義步長: /
*/#: #即步長
*/2:
注意:
(1)指定的時間點不能被指定的步長整除時, 其意義將不存在
(2) 最小時間單位為"分鐘", 想完成"秒"級任務, 需要額外借助于其他機制
定義成每分鐘任務: 再利用腳本實現在每分鐘之內, 循環執行多次
示例:
(1) 3 * * * *: 每小時的第3分鐘執行
(2) 3 4 * * 5: 每周五的 4:03 執行
(3) 5 6 7 * *: 月任務, 每月7號的 6:05執行
(4) 7 8 9 10 *: 年任務, 每年的10月9日8:07執行
(5) 9 8 * * 3,7: 每周三、日的8:09執行
(6) 0 8,20 * * 3,7: 小于指定時間點的時間要給與一個時間點
(7) 0 9-18 * * 1-5:
(8) */5 * * * *: 每5分鐘執行一次某任務
crontab 命令:
crontab [-u user] [-l | -r | -e] [-i] [-s]
-e: 編輯任務, 自動調用編輯器打開模板文件
-l: 列出自己的所有任務
-r: 移除所有任務, 即刪除crontab文件/var/spool/cron/USERNAME文件;
-i: 交互式刪除任務, 配合 -r 選項使用
-u user: root用戶可為指定用戶指定計劃任務
注意: 運行結果以郵件通知當前用戶; 如果拒絕接收郵件
(1) COMMAND > /dev/null: 只發送錯誤郵件
(2) COMMAND &> /dev/null
注意: 定義COMMAND時, 如果命令需要用到 %, 需要對其轉義; 但放置于單引號中的 %不用轉義
如果某任務在指定的時間因關機未能執行, 下次開機不會自動執行, 如果期望下次開機后無論是否到了相應時間點都要執行一次, 可使用anacron實現
原創文章,作者:black_fish,如若轉載,請注明出處:http://www.www58058.com/47269