Linux 任務計劃

Linux任務計劃
  什麼是任務計劃呢?就像咱們每一個人平常生活中都會使用到的鬧鐘同樣,按時的去提醒該去作什麼事情,以避免忘記。一樣,咱們在工做當中也要在天天在特定的時間內安排作一些事情,這就是任務計劃,本章將學習如何制定Linux系統的任務計劃,這裏主要包括兩種工具:at 和 crontab
  將來的某時間點執行一次任務:at、batch
  週期性運行某任務:croncentos

電子郵件服務:
  smtp:simple mail transmission protocol,簡單郵件傳輸協議,用於傳送郵件
  pop3:Post Office Protocol,郵局協議
  imap4:Internet Mail Access Protocol,互聯網郵件訪問協議併發

  mailx - send and receive Internet mail
  MUA:Mail User Agent
  使用mail命令發送郵件
  mailx [-s 'Subject'] username[@hostname]
    郵件正文的生成:
    一、直接編輯,經過Ctrl+d結束郵件編輯併發送
    mail -s 'Hello' king@localhost
    二、經過文件輸入重定向
    mail -s 'Hello' king@localhost < Mail_File
    三、經過管道;
    echo -e "How are you?" | mail -s 'Hello' king@localhost工具

at命令:某時間點執行一次任務
at是由atd提供服務的,在使用以前要確認是否開啓
  CentOS 6:service atd {status|start}
  CentOS 7:systemctl {status|start} atd學習

  at [option] TIME
  TIME格式:
  規定在某年某月的某一天的某個時間點執行該任務
    HH:MM [YYYY-mm-dd]
    noon, midnight, teatime,tomorrow
  在某個時間點事後多長時間執行該任務
    now+#{minutes,hours,days, weeks}
  經常使用選項:
  -q QUEUE 查詢指定任務隊列(默認只有一個隊列a)
  -l 列出指定隊列中等待運行的做業;至關於atq命令
  -d 刪除指定的做業;至關於atrm命令
  -c 查看具體做業任務
  -f /path/from/somefile 從指定的文件中讀取任務
  -m 強制at發送郵件,表示執行完畢
  注意:做業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶centos7

  執行方式:交互式、輸入重定向、at –f 文件;依賴於atd服務,須要該啓動才能實現at任務
  at隊列存放在/var/spool/at目錄中;/etc/at.{allow,deny}控制用戶是否能執行at任務
    白名單:/etc/at.allow 默認不存在,當at.allow存在時只有該文件中的用戶才能執行at命令,不在此文件的用戶不容許
    黑名單:/etc/at.deny 默認存在,拒絕該文件中用戶執行at命令,而沒有在at.deny 文件中的使用者則可執行
    若是兩個文件都存在時,at.allow的優先級高;若是兩個文件都不存在,只有 root 能夠執行 at 命令spa

示例:
HH:MM 如:02:00
在今日的HH:MM 進行,若該時刻已過,則明天此時執行任務隊列

HH:MM YYYY-MM-DD 如:04:00 2016-09-20
規定在某年某月的某一天的特殊時刻進行該項任務進程

HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrowcrontab

HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某個時間點再加幾個時間後才進行該項任務
如:now + 5 minutes
04pm + 3 daysip

演示:
# 設定計劃任務,在2分鐘後執行
[root@centos7 ~]# at now+2min
at> cat /etc/issue
at> ls /var
at> echo "hello there."
at> <EOT> # 按 Ctrl+d 提交
job 1 at Fri Feb 24 15:49:00 2017

# 查看計劃任務
[root@centos7 ~]# at -l
1 Fri Feb 24 15:49:00 2017 a root

# 從指定文件中讀取任務,不在交互式輸入
[root@centos7 ~]# at -f at.tasks now+5min
job 2 at Fri Feb 24 16:08:00 2017

[root@centos7 ~]# at -l
2 Fri Feb 24 16:08:00 2017 a root
[root@centos7 ~]# atq
2 Fri Feb 24 16:08:00 2017 a root

# 指明任務編號,刪除任務 至關於atrm
[root@centos7 ~]# at -d 2
[root@centos7 ~]# atq

[root@centos7 ~]# at -f at.tasks now+5min
job 3 at Fri Feb 24 16:09:00 2017
[root@centos7 ~]# atq
3 Fri Feb 24 16:09:00 2017 a root
[root@centos7 ~]# atrm 3
[root@centos7 ~]# atq

batch命令:讓系統自行選擇空閒時間(CPU負載小於0.8的時候)去執行此處指定的任務;

cron週期性任務計劃:
  相關的程序包:
  cronie:主程序包,提供了crond守護進程及相關輔助工具
  cronie-anacron:cronie的補充程序;用於監控cronie任務執行情況;如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨後運行一次該任務
  crontabs:包含CentOS提供系統維護任務

  須要週期性任務計劃正確執行,要確保crond守護進程處於運行狀態:
  CentOS 7:systemctl status crond
  CentOS 6:service crond status

  計劃要週期性執行的任務提交給crond,由其來實現到點運行。
  系統cron任務:系統維護做業
    /etc/crontab
  用戶cron任務:
    crontab命令

  系統cron任務/etc/crontab
  # 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

  例如:晚上9點10分運行echo命令;
  10 21 * * * gentoo /bin/echo "Howdy!"

  時間表示法:
  一、特定值:給定時間點有效取值範圍內的值
  示例:
    3 * * * *:每小時執行一次,每小時的第三分鐘
    3 4 * * 5:每週執行一次,每週五的4點3分
    5 6 7 * *:每個月執性一次,每個月的7號6點5分
    7 8 9 10 *:每一年執行一次,每一年的10月9號8點7分

  二、*:給定時間點上有效取值範圍內的全部值;表示"每"
  三、離散取值:#,#,#
  示例:
    9 8 * * 3,7:每週三和週日的8點9分
    0 8,20 * * 3,7:每週三和週日的8點和20點

  四、連續取值:#-#
  示例:
    0 9-18 * * 1-5:週一到週五(工做時間)內的每小時執行

  五、在指定時間範圍上,定義步長:/#  #即爲步長
  示例:
    0 */3 * * *:每3小時執行一次任務
    */5 * * * *:每5分鐘執行一次任務
  注意:
  指定的時間點不能被步長整除時,其意義將不復存在
  最小時間單位爲"分鐘",想完成"秒"級任務,的須要額外借助其它機制(定義成每分鐘任務,而再利用腳本實現每分鐘以內,循環執行屢次)

  用戶cron任務:
  crontab命令定義,每一個用戶都有專用的cron任務文件:/var/spool/cron/USERNAME
  crontab命令:crontab [-u user] [-l | -r | -e] [-i]
    -l 列出全部任務
    -e 編輯任務
    -r 移除全部任務
    -i 同-r一同使用,以交互式模式讓用戶有選擇地移除指定任務
    -u user 僅root可運行,爲指定用戶管理cron任務
  cron 執行的每一項工做都會被紀錄到/var/log/cron

  注意:運行結果以郵件通知給相關用戶;也能夠將命令執行結果重定向
  COMMAND > /dev/null
  COMMAND &> /dev/null
  對於cron任務來說,%有特殊用途;若是在命令中要使用%,則須要轉義;也能夠把%放置於單引號中就不須要轉義;

  如何在秒級別運行任務?
  * * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
  sleep命令:
  sleep Number[SUFFIX]...
  SUFFIX:
   s 秒(默認)
   m 分
   h 小時
   d 天

案例:
每4小時備份一次/etc目錄至/backup目錄中,保存的文件名稱格式爲「etc-yyyy-mm-dd-HH」
# mkdir /backup
# crontab -e
0 */4 * * * /bin/cp -a /etc /backup/etc-`date + '%F-%H'` > /dev/null

每週2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如「messages-yyyymmdd」
# mkdir /logs
# crontab -e
# 20 1 * * 2,4,0 /bin/cp -a /var/log/messages /logs/messages-`date +'%Y%m%d'` > /dev/null

每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
# crontab -e
# 0 */2 * * * /bin/grep -e '^S' -e '^M' /proc/meminfo >> /tmp/meminfo.txt

工做日時間內,每兩小時執行一次「ip addr show」命令
# crontab -e
# 0 9-17/2 * * 1-5 /sbin/ip addr show

相關文章
相關標籤/搜索