14.計劃任務

一、 單次任務

atd 服務負責管理單次任務

進行單次任務的程序是 at 命令, 管理他的服務是 atd

systemctl restart atd 
systemctl enable atd
systemctl status atd

工作方式

我們使用 at 這個指令來產生所要運行的工作,並將這個工作以文本文件的方式寫入 /var/spool/at/ 目錄內,該工作便能等待 atd 這個服務的取用與執行了

實際上有兩個權限控制文件,規定了哪些用戶可以使用,哪些用戶不可以使用

規則是這樣的:
一行一個用戶

  1. 首先查看 /etc/at.allow 文件。
    假如系統中存在此文件,就只允許在此文件的用戶使用 at, 其他都拒絕。

  2. 假如沒有 /etc/at.allow 文件,就看有沒有 /etc/at.deny 文件。
    這個文件意義就是,允許所有,拒絕部分。
    就是在這個文件中的用戶是被拒絕的,不在此文件中的用戶是被允許的。

  1. 默認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 命令

周的數字爲 07 時,都代表“星期天”的意思!
總結記憶:
分 時 日 月 星

除了數字還有幾個個特殊的符號:

就是 */-,

  • *代表所有的取值範圍內的數字
  • / 代表每的意思,*/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/ 目錄下的和用戶同名的文件中。
比如目前操作的用戶是 sharkshark 的計劃任務會別保存在 /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. 不要在統一時間段執行多個計劃任務

  2. 將命令的錯誤輸出重定向

*/1   *   *   *   *   /bin/echo  "hello"      2> /dev/null
  1. 周與日月不可同時並存

anacron

作用

anacron 並不是用來取代 crontab 的,anacron 存在的目的就在於我們上頭提到的,在處理非 24 小時一直啓動的 Linux 系統的 crontab 的執行! 以及因爲某些原因導致的超過時間而沒有被執行的調度工作。

其實 anacron 也是每個小時被 crond 執行一次,然後 anacron 再去檢測相關的調度任務有沒有被執行,如果有超過期限的工作在, 就執行該調度任務,執行完畢或無須執行任何調度時,anacron 就停止了。

crond 與 anacron 的關係:

  1. crond 會主動去讀取 /etc/crontab, /var/spool/cron/, /etc/cron.d/ 等配置文件,並依據“分、時、日、月、周”的時間設置去各項工作調度;

  2. 根據 /etc/cron.d/0hourly 的設置,主動去 /etc/cron.hourly/ 目錄下,執行所有在該目錄下的可執行文件;
    因爲 /etc/cron.hourly/0anacron 這個指令檔的緣故,主動的每小時執行 anacron ,並調用 /etc/anacrontab 的配置文件;

  3. 根據 /etc/anacrontab 的設置,依據每天、每週、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 內的可執行文件,以進行固定週期需要執行的指令。

也就是說,如果你每個週日的需要執行的動作是放置於 /etc/crontab 的話,那麼該動作只要過期了就過期了,並不會被抓回來重新執行。但如果是放置在 /etc/cron.weekly/ 目錄下,那麼該工作就會定期,幾乎一定會在一週內執行一次~如果你關機超過一週,那麼一開機後的數個小時內,該工作就會主動的被執行喔! 真的嗎?對啦!因爲 /etc/anacrontab 的定義啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章