首頁 > 軟體

Linux 計劃任務 Cron

2020-06-16 17:33:38

難題

---每分鐘要執行某個程式檢查服務的執行
---每天要對資料進行備份
---每月要對紀錄檔進行備份
......
如果你也存在這樣的問題,Cron將可以幫助你從繁重的工作中解脫出來。

--------------------------------------------------------------------------------

1、Cron是什麼
    Cron是計劃任務,它保證了某個程式在特定的時間內的準確執行。要安排任何一個cron,就必須有負責這個cron的服務,linux經常用到的服務有atd和crond。
    這裡注意: 雖然啟動了cron服務,但其並不會監聽埠,因為無需於外界通訊,所以只是會開啟一個進程。叫做獨立守護行程。但是像httpd這樣的獨立守護行程,因為要通訊,所以其不論是用戶端,還是伺服器端,都是要開啟埠的。 
2、Cron之at
    單時間點執行某任務,而不迴圈,依賴於atd服務
    <1>組態檔
        /etc/at.aloow
        /etc/at.deny
        組態檔,白名單優先順序更高,分為以下幾種情況
        第一種:白名單和黑名單都存在
                只允許白名單中的使用者建立計劃任務
        第二種:只存在白名單
                只允許白名單中使用者建立計劃任務
        第三種:只存在黑名單
                除黑名單以外的使用者都可以建立計劃任務
        第四種:黑白名單都不存在
                除root以外,任何使用者不能建立計劃任務
    <2>執行方式
        互動式 
        輸入重定向
        at -f FILE
    <3>時間表示法

          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 tomorrow
          HH:MM[am|pm] + number [minutes|hours|days|weeks]
            now + 5 minutes
            04pm + 3 days
          在某個時間點再加幾個時間後才進行該項任務

    <4>常見用法
        at -l:列出當前系統中等待的作業,相當與atq
        at -d:刪除指定的作業,相當於atrm
        at -f FILE:從指定的檔案中讀取任務
        at -m:任務結束後,傳送郵件(例如make、rm等,測試任務的完成狀態)
        注意: 有標準輸出或者錯誤輸出時,才會傳送郵件
3、Cron之crontab
  多時間點迴圈執行某任務,依賴於crond服務
    <1>環境安裝
    要實現cron,要安裝主程式包cronie、cronie-anacron和crantabs
    cronie:主程式包,提供crond進程服務。提供crontab工具。
    cronie-anacron:輔助程式包,用於移動裝置中那些因為各種原因而無法正常執行的系統任務。伺服器中很少用到。生成/etc/anacrontab,定義未正常執行的系統任務。
    crontabs:提供系統正常的系統任務。生成/etc/crontab系統級計劃任務。
    <2>Cron分為使用者級別和計劃任務和系統級別的計劃任務
      使用者級別的計劃任務直接使用crontab定義(使用者也可以直接編輯/etc/crontab,只不過修改MAILTO引數)
      系統級別的的計劃任務在/etc/cron.d中
[root@CentOS7/etc/cron.d]#ls    //在此目錄下直接編輯檔案也可以
0hourly  raid-check  sysstat   
[root@centos7/etc/cron.d]#   
[root@centos7/etc/cron.d]#vim 0hourly    //0hourly是每小時任務
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly    //生效的檔案在/etc/cron.hourly
[root@centos7/etc/cron.hourly]#ls
0anacron  0yum-hourly.cron    //0anacron保證了/etc/anacrontab計劃任務的執行
                              //0yum-hourly.cron同理
[root@centos7/etc/cron.hourly]#vim /etc/anacrontab    //真正定義anacrontab的檔案,包括
                                                        /etc/cron.daily、/etc/cron.monthly
                                                        /etc/cron.weekly等檔案中

      注意:系統級任務排程主要完成系統的一些維護操作,使用者級任務排程主要完成使用者自定義的一些任務,可以將使用者級任務排程放到系統級任務排程來完成(不建議這麼做),但是反過來卻不行。
      cron的工作模式

  <3>crontab工具的使用 
      書寫格式

      常見用法
        crontab -e:定義當前使用者的計劃任務,
                      儲存在/var/spool/cron中
          crontab -e -u USER: 修改指定使用者的計劃任務
          crontab -u USER -l:檢視指定使用者的計劃任務,
                      只有root可以檢視
          crontab -r:移除所有的計劃任務
      注意:crontab是擁有suid許可權,所以當root修改了普通使用者的計劃任務之後,使用者是可以再次修改的,但是是無法直接修改root的計劃任務的。
    <4>時間表示法
      (1)特定值:
          給定時間點有效取值範圍內的值
      (2)*
          給定時間點上有效取值範圍內的所有值
          表示“每...”
      (3)離散取值:
          #,#,#
      (4)連續取值:-
          #-#
      (5)在指定時間範圍上,定義步長:
          /#: #即為步長   
  <5>組態檔
      /etc/cron.deny:定義了所有不允許使用crantab的使用者列表
      /etc/cron.allow:定義了所有允許使用crantab的使用者列表
      /var/spool/cron/USER:使用者定義的計劃任務
      /var/spool/mail/USER:使用者的郵件 
  <5>Cron常見錯誤
      環境變數不指定
[root@centos7~]#vim echo.sh
#!/bin/bash
wall everyone..
[root@centos7~]#vim /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin    //注意:此處的環境變數
MAILTO=root
...
[root@centos7~]#crontab -e
* * * * * echo.sh    //錯誤,環境變數中不存在

      命令書寫格式錯誤
0 * * * * tar -Jcf /backup/etc-`date +%F-%H`.tar.xz /etc/    //格式誤,%要跳脫
# 正確的格式
0 */5 * * * tar -Jcf /backup/etc-`date +%F-%H`.tar.xz /etc/
 
    date +%w:顯示星期幾

      時間域不明確
# 第一個域和第三個域是或關係
0 0 1-7 1 1  hostname    //表示一月第一個星期或者一月的每週一,執行hosrname
                          而不是一月的第一個星期的星期一

      分鐘設定誤用
# 每倆小時執行一下/etc/echo.sh
* */2 * * * * etc/echo.sh    //錯誤:這表示每分鐘執行一次
# 正確的格式
0 */2 * * * * etc/echo.sh

注意:在crontab中,精度最高只能到分鐘級別,如果要使用秒級別的話,可在指令碼中使用sleep
也可以
*/1 * * * * sleep 30 date >> /tmp/f1 &> /dev/null

--------------------------------------------------------------------------------

強化練習:

1、每天的2點整和12點整,將/etc目錄至/backup目錄中,儲存的檔名稱格式為“etc-yyyy-mm-dd-HH.tar.xz”   
0 2,12 * * * tar -Jcf /backup/etc-`date +%F-%H`.tar.gz /etc/*

2、每週2, 4, 7備份/var/log/messages檔案至/logs目錄中,檔名形如“messages-yyyymmdd 
0 0 * * 2,4,7 cp -a /var/log/message /log/massage-`date +%F`

3、每兩小時取出當前系統/proc/meminfo檔案中以S或M開頭的資訊追加至/tmp/meminfo.txt檔案中
 0 */2 * * * cat /proc/meminfo | grep "^[SM]" >> /tmp/meminfo.txt

4、工作日時間,每10分鐘執行一次磁碟空間檢查,一旦發現任何分割區利用率高於80%,就執行wall警報
[root@centos7~/bin]#vim cron.sh
#!/bin/bash
HI=`df | grep "^/dev/sd[a-h]" | tr -s ' ' '%' | cut -d'%' -f 5`
if [ $HI -lt 80 ]; then
  wall dangerous
fi
[root@centos7~/bin]#crontab -e
*/10 * * * 1-5 /root/bin/cron.sh

Linux中利用crontab建立計劃任務 http://www.linuxidc.com/https://www.linuxidc.com/Linux/2013-06/86401.htm

Linux中用crontab例行工作安排 http://www.linuxidc.com/https://www.linuxidc.com/Linux/2013-06/85441.htm

Linux crontab不執行問題排查 http://www.linuxidc.com/https://www.linuxidc.com/Linux/2013-06/85432.htm

Ubuntu使用crontab定時任務 http://www.linuxidc.com/https://www.linuxidc.com/Linux/2013-05/84770.htm

Linux計劃任務(at batch crontab anacron) http://www.linuxidc.com/https://www.linuxidc.com/Linux/2013-03/81584.htm

Linux任務計劃 (at,crontab) http://www.linuxidc.com/Linux/2015-09/122970.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-09/135109.htm


IT145.com E-mail:sddin#qq.com