計劃任務 cron 計劃任務: 讓系統在將來的指定時間點執行某些任務(程式);任務可以周期性執行也可以僅僅執行一次。 Linux系統中計劃任務:at和cron服務是操作系統內置的2個服務,預設情況是安裝好的。 at服務:指定某個時間一次性執行某個任務,依賴於系統後臺atd進程 cron服務:指定時間 ...
計劃任務 cron
計劃任務:
讓系統在將來的指定時間點執行某些任務(程式);任務可以周期性執行也可以僅僅執行一次。
Linux系統中計劃任務:at和cron服務是操作系統內置的2個服務,預設情況是安裝好的。
at服務:指定某個時間一次性執行某個任務,依賴於系統後臺atd進程
cron服務:指定時間周期性執行某個任務,依賴於系統後臺crond進程
作用: 計劃任務主要是做一些周期性的任務,目前最主要的用途是定期備份數據
Schedule one-time tasks with at. 一次性調度執行 at
Schedule recurring jobs with cron. 迴圈調度執行 cron
Schedule recurring system jobs.
所有計劃任務執行中的輸出都會以郵件的方式發送給指定用戶, 除非重定向
一次性調度執行 at
at任務計劃:
1、確定at這個服務是否安裝:
# rpm -q at at-3.1.10-43.el6_2.1.x86_64
2、相關的文件:
# rpm -ql at |grep etc /etc/at.deny 用戶控制列表,拒絕用戶列表/etc/at.allow(預設麽有,允許列表);預設是允許所有用戶使用at服務 /etc/rc.d/init.d/atd at服務的啟動腳本 /etc/pam.d/atd 驗證機制 /usr/bin/at --命令 /usr/bin/atq --查看at的任務列表 /usr/bin/atrm --刪除任務 /var/spool/at/xxx --計劃任務的文本文件保存目錄
3、常用的命令:
at:制定一個一次性計劃任務 -l 列出at任務 等於atq -d 刪除at任務 等於atrm -c 查看任務內容
4、命令格式:
at 3:30pm at 15:30 at 10:10 today at now+2min ——2分鐘後執行 at 4pm + 3 days ——3天以後的下午4點運行此job at 10am Jul 31 ——在7月31日上午10點運行此job at 1am tomorrow ——明天上午1點運行此job at 4:00 2020-12-12 ——在2020-12-12日的凌晨4點執行 at -t 09201430 ——9月20日的下午2:30運行此job at -t 202009201430 ——2020年的9月20日的下午2:30運行此job # man at at now + 5 minutes 任務在5分鐘後運行 at now + 1 hour 任務在1小時後運行 at now + 3 days 任務在3天後運行 at now + 2 weeks 任務在兩周後運行 crtl + d --結束 實例:比較複雜的任務可以保存到腳本:
at服務訪問控制:
/etc/at.allow 作用:只允許文件裡面出現的用戶使用atd這個服務,如果這個文件存在,就不去考慮at.deny
/etc/at.deny 作用:只拒絕裡面的用戶使用atd這個服務, 如果at.allow不存在的時候,才生效
示例
例1: [root@tianyun ~]# at now +1min --一分鐘後執行 at> useradd uuuu at> <EOT> job 1 at Sat Mar 21 22:34:00 2015 [root@localhost~]# atq 3 Thu Mar 30 09:55:00 2017 a root [root@tianyun ~]# id uuuu 例2: [root@localhost~]# vim at.jobs ---創建一個文件,名字可以自定義 useradd u99 useradd u00 touch /`date +%F`.txt [root@localhost~]# at now +1min < at.jobs 一分鐘後執行輸入這個文件裡面的命令並執行
周期性計劃任務 crontab
當需要周期性的重覆執行任務是可以使用cron服務;該服務每分鐘檢查一次,並執行符合條件的任務
1、查看服務是否啟動
# service crond status # /etc/init.d/crond status
2、查看相關的文件列表
# which crontab # rpm -qf /usr/bin/crontab # rpm -ql crontabs # rpm -ql cronie /var/spool/cron 用戶級別的計劃任務存放目錄(以用戶命名) /etc/cron.deny /etc/pam.d/crond /etc/rc.d/init.d/crond 啟動腳本 /usr/bin/crontab 用戶級別的命令 /usr/sbin/crond 二進位的命令 /etc/cron.d/ 裡面通常存放用來設定除了每天/每周/每月之外的定時任務,比如說每小時周期執行的任務和其他任何定時任務。 /etc/cron.d/0hourly 系統每小時第一分鐘需要執行的任務 /etc/cron.deny 用戶拒絕列表(在該文件中的用戶不能使用cron服務) /etc/crontab 該文件的作用相當於/etc/cron.d/下麵的某一個文件,可以定義系統計劃任務。 /var/spool/cron 這個目錄用來存放各個用戶自己設定的定時任務,普通用戶沒有許可權直接訪問,必須通過crontab 命令(setuid) /etc/cron.monthly/ 存放系統每個月需要執行的腳本 /etc/cron.weekly/ 存放系統每周需要執行的腳本 /etc/cron.daily/ 存放系統每天需要執行的腳本 /etc/cron.hourly/ 存放系統每小時需要執行的腳本
3、crontab 格式說明
# cat /etc/crontab 這裡存放有系統運行的一些調度程式。每個用戶可以建立自己的調度crontab。 SHELL=/bin/bash 預設的shell,告訴系統使用哪個shell PATH=/sbin:/bin:/usr/sbin:/usr/bin 定義命令的路徑 MAILTO=root 命令的執行結果以郵件的形式發送給root(不管是標準正確還是錯誤結果),如果MAILTO=“” ,代表不會發郵件給任何人。 HOME=/ 定義在執行命令或腳本時的主目錄 # 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 前5個欄位分別表示: 分鐘:0-59 小時:0-23 日期:1-31 月份:1-12 星期:0-7(0表示周日或者7表示周日) 還可以用一些特殊符號: ,: 表示分割,間隔。如第二個*表示成 8,10,就表示8點和10點 -:表示一個段,如第二個*表示成 1-5,就表示1到5點 /n : 表示每個n的單位執行一次,如第二個*表示成*/1, 就表示每隔1個小時執行一次命令。
示例
00 02 * * * ls //每天2:00整 00 02 1 * * ls //每月1號2:00整 00 02 14 2 * ls //每年2月14號2:00整 00 02 * * 7 ls //每周日2:00整 00 02 * 6 5 ls //每年6月的周五2:00整 00 02 14 * 7 ls //每月14號2:00整 或者 每周日2:00整,這兩個時間都執行 00 02 14 2 7 ls //每年2月14號2:00整 或者 每周日2:00整,這兩個時間都執行 00 02 * * * ls //每天2:00整 * 02 * * * ls //每天2:00中的每一分鐘 * * * * * ls //每分鐘執行ls * * 14 2 * ls //2月14號的每分鐘 1440分鐘 */5 * * * * ls //每隔5分鐘 00 02 1,5,8 * * ls //每月1,5,8號的2:00整 00 02 1-8 * * ls //每月1到8號的2:00整
思考1
如果系統斷電或者宕機,錯過任務執行的時間,怎麼辦?
anacron任務:
是cron服務的擴展,配合cron服務一起使用,當系統斷電或者宕機,錯過任務執行的時間時,系統啟動後它會再次執行未執行的任務。
配置文件:/etc/anacrontab
#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
說明:對於每個計劃任務,anacrontab先判斷period(執行頻率)期間內是否被執行了,如果沒執行則等待delay(延遲時間),再次執行該任務。
一般情況下該文件不用修改,知道原理就可以。
總結:
1、如果你有很多任務需要每天|周|月重覆執行,並且希望系統能自動把漏掉的任務補回來,那麼你可以將你的腳本放在系統響應的目錄下麵/etc/cron.{d{daily,weekly,monthly},並賦予可執行許可權。
2、以上需要系統定時去調用的任務將就叫系統級別的計劃任務。
示例
通過至少2種方法指定一個周期性的計劃任務:
1、stu01用戶每周日和周三的凌晨5點04分在查看/etc/hosts文件內容並保存到/tmp/stu01文件中 04 05 * * 0,3 stu01 cat /etc/hosts >/tmp/stu01 vim 1.sh cat /etc/hosts >/tmp/stu01 04 05 * * 0,3 stu01 /root/1.sh 2、root用戶往/tmp/stu01的文件里每隔2分鐘追加當前的系統時間 */2 * * * * root date >>/tmp/stu01
設定用戶級別的定時任務
相關命令:
普通用戶編輯自己的定時任務 crontab -e <--- 編輯當前用戶自己的定時任務(使用環境變數EDITOR指定的預設編輯器) crontab -l <--- 列出當前用戶自己所有的定時任務 crontab -r <--- 刪除當前用戶自己所有的定時任務 作為管理員,root可以設定/調整所有用戶的定時任務,命令和上面類似,只是增加了一個-u <username> 的參數 crontab -e -u redhat <--- 編輯指定用戶的定時任務(使用環境變數EDITOR指定的預設編輯器) crontab -l -u redhat <--- 列出指定用戶所有的定時任務 crontab -r -u redhat <--- 刪除指定用戶所有的定時任務 說明: 1、crontab 預設調用的是vi編輯器,編輯計劃任務的用法和vi一樣。如果想自己定義編輯器,通過修改環境變數完成。如export EDITOR=vim 2、用戶級別的任務定義當中,沒有用戶名那一欄,如果像定義系統級別的命令那樣,輸入用戶名,crontab編輯器不會提示格式錯誤,但是任務不會得到正確的執行。
* * * * * command or file.sh or run-parts /dir/ 說明: 1、如果執行腳本文件,那麼需要有可執行許可權,如果沒有可以使用bash|sh等指定一種解釋器執行 2、如果run-parts,那麼後面指定的目錄里的所有腳本文件必須要有可執行許可權 3、用戶級別的計劃任務,不需要指定username 4、普通用戶不能夠直接vim修改自己的計劃任務文件(/var/spool/cron/username)
cron使用限制
/etc/cron.deny ——只拒絕哪些用戶不能他用crontab,預設存在空文件 /etc/cron.allow ——允許哪些用戶使用crontab 如果同一個用戶即在拒絕里又在允許里,預設允許優先。
思考2
如果我用crontab -e 寫了晚上8:30去關機,但是我18點就手動關機了,第二天來9點來開機,它會不會延遲一段時間又關機呢?
答案:不會
示例
備份etc目錄,要求: 1. 每天4:00備份/etc目錄到/var/back mkdir /var/back tar -czf /var/back/$(date +%F)_etc.tar.gz /etc 00 04 * * * 2. 將備份命令寫在腳本中,如/root/back.sh,加執行許可權 vim /root/back.sh tar -czf /var/back/$(date +%F)_etc.tar.gz /etc chmod +x /root/back.sh 3. 每天備份的文件名包含當天的日期,如2016-11-09_etc.tar.gz 4. 計劃任務執行時,屏幕不產生任何輸出 00 04 * * * /root/back.sh &>/dev/null 5. 只保留最近5天的備份 find /var/back -ctime +5 -exec rm -f {} \; find /var/back -ctime +5 |xargs rm -f vim /root/bak.sh mkdir /var/back tar -czf /var/back/$(date +%F)_etc.tar.gz /etc find /var/back -ctime +5 -exec rm -f {} \; chmod +x /root/bak.sh crontabe: 00 04 * * * bash /root/bak.sh
#!/bin/bash dir=/var/back #判斷備份的目錄是否存在,如果不存在就創建它 [ ! -d $dir ] && mkdir $dir #備份/etc目錄,使用tar工具 tar -czvf $dir/$(date +%F)_etc.tar.gz /etc #備份的文件只需要保留5天以內 find $dir -ctime +5 -exec rm -f {} \; crontabe: 00 04 * * * bash /root/bak.sh