一、 單次任務
atd 服務負責管理單次任務
進行單次任務的程序是 at
命令, 管理他的服務是 atd
。
systemctl restart atd
systemctl enable atd
systemctl status atd
工作方式
我們使用 at 這個指令來產生所要運行的工作,並將這個工作以文本文件的方式寫入 /var/spool/at/ 目錄內,該工作便能等待 atd 這個服務的取用與執行了
實際上有兩個權限控制文件,規定了哪些用戶可以使用,哪些用戶不可以使用
規則是這樣的:
一行一個用戶
首先查看
/etc/at.allow
文件。
假如系統中存在此文件,就只允許在此文件的用戶使用at
, 其他都拒絕。假如沒有
/etc/at.allow
文件,就看有沒有/etc/at.deny
文件。
這個文件意義就是,允許所有,拒絕部分。
就是在這個文件中的用戶是被拒絕的,不在此文件中的用戶是被允許的。
- 默認CentOS7系統是有一個空的
/etc/at.deny
文件。
意思是允許所有人使用at
命令的意思。
具體操作
[root@study ~]# at [-mldv] TIME
[root@study ~]# at -c 工作號碼
選項與參數:
-m :當 at 的工作完成後,即使沒有輸出訊息,亦以 email 通知使用者該工作已完成。
-l :at -l 相當於 `atq` 命令,列出目前系統上面的所有該使用者的 at 調度;
-d :at -d 相當於 `atrm` 命令 ,可以取消一個在 `at` 調度中的工作;
-v :可以使用較明顯的時間格式列出 at 調度中的工作列表;
-c :可以列出後面接的該項工作的實際指令內容。
TIME:
時間格式,可以定義出『什麼時候要進行 at 這項工作』的時間.
格式有:
HH:MM 如: 04:00
在今日的 HH:MM 進行,若時間已過,則在明天的 HH:MM 進行行此工作。HH:MM YYYY-MM-DD 如: 04:00 2019-07-28
強制在某年某月的某一天的特殊時刻進行該工作!HH:MM[am|pm] + number [minutes|hours|days|weeks]
如:
now + 5 minutes
和
04pm + 3 days
就是說,在某個時間點『再加上幾個時間後』才進行。
示例:
創建
[root@kvm-docker ~]# at now + 5 minutes
at> echo "hello" > /dev/pts/0
at> <EOT>
job 1 at Sat Jul 27 18:49:00 2019
查詢
[root@kvm-docker ~]# atq
1 Sat Jul 27 18:49:00 2019 a root
二、週期性的任務
就是 計劃任務
循環執行的例行性工作調度則是由 cron (crond) 這個系統服務來控制的。
默認情況下,每個用戶都可以通過 crontab
管理自己的計劃任務。
和 at
一樣,有兩個文件控制權限。
/etc/cron.allow
/etc/cron.deny
使用規則是和之前的
at
的文件一樣。
/etc/cron.allow
比/etc/cron.deny
要優先, 請永遠用一個文件進行控制,別給自己找麻煩!
crontab -e
設置格式
命令格式的前一部分是對時間的設定
後面一部分是要執行的命令。
關於時間
參考:
cat /etc/crontab
代表意義 | 分鐘 | 小時 | 日期 | 月份 | 周 | 指令 |
---|---|---|---|---|---|---|
數字範圍 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 命令 |
周的數字爲
0
或7
時,都代表“星期天”的意思!
總結記憶:
分 時 日 月 星
除了數字還有幾個個特殊的符號:
就是 *
、/
和 -
、,
,
-
*
代表所有的取值範圍內的數字 -
/
代表每的意思,*/5
表示每5個單位 -
-
代表從某個數字到某個數字 -
,
代表分隔時段的意思,就是和
的意思
以下舉幾個例子說明:
每天早上6點:
0 6 * * * command
每兩個小時:
0 */2 * * * command
23 點到早上7點之間每兩個小時, 並且還有早上8點:
0 23-7/2,8 * * * command
每個月的 4 號的早上11點和每週的週一到週三的早上11點:
0 11 4 * 1-3 command
1月1日早上2點 30 分:
30 2 1 1 * command
管理當前用戶的計劃任務
創建/再次編輯
這會調用 `vi` 打開一個臨時文件
➜ ~ crontab -e
*/1 * * * * /bin/echo "ok shark"
編輯好後,想使用
vi
一樣保存退出。
保存後,這個信息會被保存在/var/spool/cron/
目錄下的和用戶同名的文件中。
比如目前操作的用戶是 shark , shark 的計劃任務會別保存在/var/spool/cron/shark
文件中。
這個文件每個用戶只有一個。
查看
➜ ~ crontab -l
*/1 * * * * /bin/echo "ok shark"
➜ ~ cat /var/spool/cron/root
*/1 * * * * /bin/echo "ok shark"
修改/刪除一個
再次使用 crontab -e
命令利用 vi
進行修改和刪除單個計劃任務。
刪除全部
crontable -r
cron 的系統級別的配置文件
/etc/crontab
和 /etc/cron.d/*
/etc/crontab
➜ ~ cat /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
# | | | | |
# * * * * * user-name command to be executed
MAILTO=root
就是執行這個計劃任務的命令出錯時,或者是該計劃任務的執行結果有 STDOUT/STDERR 時,將這些信息發送給root
用戶。
一般改成自己的賬戶[email protected]
user-name
執行後面命令的 身份賬戶
/etc/crontab
裏面當然要指定身份
/etc/cron.d/*
在此目錄下的所有文件都會被 crond
服務識別爲一個計劃任務的列表文件。
➜ ~ ls /etc/cron.d/
0hourly
這個文件,crond 會從 1 到 5 分鐘,隨機挑選一個時間執行這個文件中的計劃任務。
➜ ~ cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bashin/
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
run-parts
腳本會在大約5
分鐘內隨機選一個時間來執行 /etc/cron.hourly 目錄內的所有可執行文件
也就是說這裏的計劃任務是:
以 root 用戶的身份,每個小時的第1
分鐘執行/etc/cron.hourly
目錄下的所有腳本。
/etc/cron.hourly
目錄下必須是可執行文件。
最佳實戰
不要在統一時間段執行多個計劃任務
將命令的錯誤輸出重定向
*/1 * * * * /bin/echo "hello" 2> /dev/null
- 周與日月不可同時並存
anacron
作用
anacron 並不是用來取代 crontab 的,anacron 存在的目的就在於我們上頭提到的,在處理非 24 小時一直啓動的 Linux 系統的 crontab 的執行! 以及因爲某些原因導致的超過時間而沒有被執行的調度工作。
其實 anacron 也是每個小時被 crond 執行一次,然後 anacron 再去檢測相關的調度任務有沒有被執行,如果有超過期限的工作在, 就執行該調度任務,執行完畢或無須執行任何調度時,anacron 就停止了。
crond 與 anacron 的關係:
crond 會主動去讀取 /etc/crontab, /var/spool/cron/, /etc/cron.d/ 等配置文件,並依據“分、時、日、月、周”的時間設置去各項工作調度;
根據 /etc/cron.d/0hourly 的設置,主動去 /etc/cron.hourly/ 目錄下,執行所有在該目錄下的可執行文件;
因爲 /etc/cron.hourly/0anacron 這個指令檔的緣故,主動的每小時執行 anacron ,並調用 /etc/anacrontab 的配置文件;根據 /etc/anacrontab 的設置,依據每天、每週、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 內的可執行文件,以進行固定週期需要執行的指令。
也就是說,如果你每個週日的需要執行的動作是放置於 /etc/crontab 的話,那麼該動作只要過期了就過期了,並不會被抓回來重新執行。但如果是放置在 /etc/cron.weekly/ 目錄下,那麼該工作就會定期,幾乎一定會在一週內執行一次~如果你關機超過一週,那麼一開機後的數個小時內,該工作就會主動的被執行喔! 真的嗎?對啦!因爲 /etc/anacrontab 的定義啦!