咱們在系統的管理中,不少時候不是及時的去操做,好比對某一網站數據的備份,備份的過程須要佔用大量的系統資源,凌晨三四點的時候系統訪問用戶最少,系統最空閒。但咱們的系統的系統管理員總不能老那個時間爬起來操做吧。shell
計劃命令分一次性計劃和週期性計劃。
at 安排做業在某一時刻執行一次
batch 安排做業在系統負載不重時執行一次
cron 安排週期性運行的做業vim
一次性計劃at和batchcentos
刪除at計劃任務
at -dbash
查看at計劃任務
ls /var/spool/at/網站
做用:
安排一個或多個命令在系統負載較輕進運行一次(通常狀況下負載較輕指平均負載降到0.8如下)url
使用方法同atcentos7
做用:用於生成cron進程所須要的crontab文件spa
crontab命令:日誌
crontab[-u user] [-l | -r | -e] [-i]code
-l: 列出全部任務;
-e: 編輯任務;
-r: 移除全部任務;
-i:同-r一同使用,以交互式模式移除指定任務
-u user: 僅root可運行,指定用戶管理cron任務
crontab命令定義,每一個用戶都有專用的cron任務文件:/var/spool/cron/USERNAME
注意:運行結果的標準輸出和錯誤以郵件通知給相關用戶
centos7 # systemctl status atd crond開機時需啓動服務
systemctl enable atd crond 重啓仍是啓動的
centos6 # service crond atd start開機時需啓動服務
chkconfig --list atd crond開機啓動確保爲on狀態
/var/spool/cron/ :存放用戶的任務計劃
/etc/cron.{allow,deny} :控制用戶建立任務計劃黑白名單,同at原理同樣
/var/log/cron :日誌文件
/etc/cron.hourly/ :每小時執行的腳本
/etc/cron.daily/ :天天執行的腳本
/etc/cron.weekly/ :每週執行的腳本
/etc/cron.monthly/ :每月執行腳本
[root@rhel6 ~]# cat /etc/crontab #配置文件
SHELL=/bin/bash #執行任務命令的shell類型
PATH=/sbin:/bin:/usr/sbin:/usr/bin #執行任務的環境變量
MAILTO=root #執行任務的用戶
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
時間通配表示:
@reboot :系統啓動後執行
@yearly 0 0 1 1 * :每一年的1月1號00:00執行一次任務
@annually 0 0 1 1 * :每一年的1月1號00:00執行一次任務
@monthly 0 0 1 * * :每個月的1號00:00執行一次任務
@weekly 0 0 * * 0 :每週日的00:00執行一次任務
@daily 0 0 * * * :天天的00:00執行一次任務
@hourly 0 * * * * :每小時執行一次任務
對於cron任務來說,%有特殊用途;若是在命令中要使用%,則須要轉義;不過,若是把%放置於單引號中,也能夠不用轉義
思考:如何在秒級別運行任務?
實現每秒執行
因爲crontab最小時間單位爲分鐘,因此咱們須要借用sleep命令使其「睡一會」,來實現秒級別,及不能整除時間單位的計劃任務。
sleep NUMBER [SUFFIX]...
SUFFIX:
s: 秒, 默認
m: 分
h: 小時
d: 天
如:每20秒執行一次
* * * * * for min in 0 1 2; do echo "hi"; sleep 20 ;
done實現每秒執行
#vim test.sh #!/bin/bash while true ;do sleep 1 echo "hello" done #crontab –e * * * * * /root/test.sh >> /data/mail #cat /data/mail
練習 ①每12小時備份一次/etc目錄至/backups目錄中,保存文件名稱格式爲「/etc-yyyy-mm-dd-hh.tar.gz」 # crontab -e 0 */12 * * * tar -zcf /etc-`date +\%F-\%H`.tar.gz /backups ②每週2,4,7備份/var/log/secure文件至/logs目錄中,文件名格式爲「secure-yyyymmdd」; # crontab -e * * * * 2,4,7 cp -r /var/log/secure /logs/secre-`date +\%F` ③每兩個小時取出當前系統/proc/meminfo文件中以S或M開頭的行信息追加至/tmp/meminfo.txt文件中; # crontab -e 0 */2 * * * grep "^[SM].*"/proc/meminfo >> /tmp/meminfo.txt ④四月的第一個星期日早晨1點59分運行a.sh # crontab -e 59 1 1-7 4 * test `date +\%w` -eq 0 && bash a.sh ⑤工做日時間,每10分鐘執行一次磁盤空間檢查,一旦發現任何分區利用率高於80%,就執行wall警報 # vim /testdir/disk.sh #!/bin/bash a=`df | grep "^/dev/sd" | tr -s ‘ ‘ ‘%‘| cut -d% -f5 | sort -n | tail -1` if [ $a -gt 80 ];then wall "The disk will be full" fi # chmod +x disk.sh # crontab -e */10 * * * 1-5 /testdir/disk.sh