Linux定時任務


為什么需要定時任務?

個人理解因為服務器通常在白天會比較繁忙,對於一些服務器的定期日常維護任務,比如數據庫的備份、大數據的壓縮等,這些操作都是非常耗費資源的,在白天執行或者說服務器繁忙的時候執行有可能導致服務器故障,所以使用定時任務 在深夜去執行比較合理。

還有一點就是對於一些日常維護工作,如果人為定時執行難免容易疏忽或者遺忘,而讓系統定時執行則不存在這個問題。

at一次性定時任務

確定at安裝
# at服務是否安裝 chkconfig --list | grep atd # at服務的啟動 service atd restart # 對於d結尾的服務,這里d代表daemon,守護進程,一般是作為系統服務 
at的訪問控制
  1. 如果系統中有 /etc/at.allow 文件,那么只有寫入該文件(白名單)中的用戶可以使用 at 命令( /etc/at.deny 文件會被忽略)
  2. 如果系統中沒有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么寫入該文件(黑名單)中的用戶不能使用 at 命令,對root不起作用(系統默認有該文件而沒有allow文件)
  3. 如果系統中這兩個文件都不存在,那么只有root用戶可以使用 at 命令
at命令

語法:at [選項] 時間
-m: 當at工作完成后,無論是否命令有輸出,都用email通知執行at命令的用戶
-c 工作號: 顯示該at工作的實際內容時間

atq #查詢當前服務器上的at工作
atrm [工作號] #刪除指定的at任務

命令示例

1.在兩分鍾之后執行hello.sh腳本,在at提示符輸入具體的任務后:/root/hello.sh,按 ctrl + d 保存並退出
通過 atq 查看該定時任務,通過 at -c 1 查看該任務內容

[root@localhost ~]# at now +2 minutes at> /root/hello.sh at> <EOT> job 1 at 2019-03-09 22:51 

2.在指定的時間重啟服務器(生產環境不建議)

[root@localhost ~]# at 02:00 2019-03-10 at> /bin/sync at> /sbin/shutdown -r now 

crontab循環定時任務

crond服務管理
chkconfig --list | grep crond #確認是否安裝該服務 service crond status #確認服務是否開啟 chkconfig crond on #設置自啟動 yum -y install vixie-cron crontabs #安裝cron服務 
訪問控制
  1. 當系統中有 /etc/cron.allow 文件時,只有寫入此文件的用戶可以使用 crontab 命令,如果有此文件,/etc/cron.deny文件會被忽略
  2. 當系統中只有 /etc/cron.deny 文件時,則寫入此文件的用戶不能使用 crontab 命令
crontab命令

語法:crontab [選項]
-e: 編輯crontab定時任務
-l: 查詢crontab任務
-r: 刪除當前用戶所有的crontab任務

注意事項
  1. 編輯任務其實是在vim編輯器中進行,所以如果只想刪除某個指定的定時任務,直接編輯crontab,刪除該行命令即可
  2. 執行 crontab 命令會將當前用戶登錄的身份綁定在 crontab 命令中,也就是說用戶執行的任務不能超出當前用戶的權限
格式說明

執行 crontab -e 命令會打開vim編輯你的工作
任務具體格式是:* * * * * 執行的任務

特殊符號的含義
示例

簡單演示

# 測試定時任務,每1分鍾輸出一句話到文件中
*/1 * * * * echo "silly" >> test.log 
# 每周二5點5分重啟服務器,僅測試(不推薦定時重啟,容易出錯)  
5 5 * * 2 /sbin/shutdown -r now  
# 每月1,10,15號凌晨5點整執行備份腳本
0 5 1,10,15 * * /root/sh/autobak.sh  
格式注意事項
  1. 六個選項都不能為空,必須填寫。如果不確定使用“*”代表任意時間
  2. crontab定時任務,最小有效時間是分鍾,最大時間范圍是月,像2018年某時執行,3點30分30秒這樣的時間都不能識別
  3. 在定義時間時,日期和星期最好不要在一條定時任務中出現,因為它們都是以天作為單位,非常容易讓管理員混亂
  4. 在定時任務中,不管是直接寫命令,還是在腳本中寫命令,最好都是用絕對路徑(因為定時任務有定義自己的PATH)

系統的crontab設置

"crontab -e" 是每個用戶執行的命令,也就是說不同的用戶身份可以執行自己的定時任務。可是有些定時任務需要系統執行,這時我們就需要編輯 /etc/crontab 這個配置文件了

vim /etc/crontab
# 文件內容如下,默認僅定義了一些變量
# 使用標准的bash作為定義任務執行shell
SHELL=/bin/bash
# 定時任務使用的PATH環境變量
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 如果定時任務發生了任何報錯或者出現提示,都會向root用戶發送郵件
MAILTO=root
# 標識主目錄
HOME=/
# 以下內容都是注釋內容,說明了定義定時任務的格式,需要額外指定用戶名
# .---------------- 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
CentOS 5中的配置文件

在centos5中該配置文件除了基本變量定義外,還包含了以下內容

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

也就是說centos5這4個目錄 /etc/cron.*** 下的文件會按指定規則定時執行,只需將腳本拷貝到這些目錄下即可。
這樣的好處是不需要自己手工指定定時任務的規則了,而且進入相應的目錄就能看到系統需要執行哪些定時任務。
即使在CentOS 6中這幾個目錄的功能依然生效,只是centos6以后使用 anacron 來取代管理。

執行定時任務方法
  1. 通過 crontab -e 手工執行
  2. 系統定時任務
    ① 把需要定時執行的腳本復制到 /etc/cron.{hourly,daily,weekly,montly} 目錄中的任意一個
    ② 修改 /etc/crontab 配置文件,添加需要執行的任務

anacron配置

anacron是用來保證在系統關機的時候錯過的定時任務,可以在系統開機之后再執行,也就是說有時候因為某種原因或者故障導致的系統無法執行該執行的定時任務,使用anacron管理就非常實用

anacron檢測周期
  1. anacron會使用一天,七天,一個月作為檢測周期
  2. 在系統的 /var/spool/anacron/ 目錄中存在 cron.{daily,weekly,monthly} 文件,用於記錄上次執行cron的時間
  3. 和當前時間做比較,若果兩個時間的差值超過了anacron的指定時間差值,證明有cron任務被漏執行
配置文件
SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 指定延遲是為了保證目錄下的腳本不會同時執行,錯開時間避免造成服務器過大壓力 # 最大隨機延遲 RANDOM_DELAY=45 # anacron的執行時間范圍是3:00 - 22:00 START_HOURS_RANGE=3-22 #天數 強制延遲(分) 工作名稱 實際執行的命令 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 
執行過程

以 cron.daily 工作來說明執行過程

  1. 首先讀取 /var/spool/anacron/cron.daily 中的上一次anacron執行的時間
  2. 和當前時間比較,如果兩個時間的差值超過1天,就執行cron.daily工作(准備執行)
  3. 執行這個工作只能在03:00-22:00之間
  4. 執行工作時強制延遲時間為5分鍾,再隨機延遲0-45分鍾時間
  5. 使用nice命令指定默認優先級,使用 run-parts 腳本(命令)執行 /etc/cron.daily 目錄中的所有可執行文件
anacron總結
  • anacron最小檢測周期是天,使用anacron管理的定時任務應該最小是每隔一天執行
  • 將需要定時執行的腳本拷貝到/etc/cron.{daily,weekly,monthly}目錄下即可被anacron管理
  • 使用anacron優點是全自動執行,不用人為干預和配置,缺點是執行時間不可控制
  • 可以將定時任務(天周期及以上)手工指定或系統crontab配置,同時放到anacron管理目錄下做雙重保障
  • cron.hourly 由 /etc/cron.d/0hourly 調用,所以放在該目錄下的腳本也會生效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM