2021-05-12 14:32:11
Linux 計劃任務 Cron
難題
---每分鐘要執行某個程式檢查服務的執行
---每天要對資料進行備份
---每月要對紀錄檔進行備份
......
如果你也存在這樣的問題,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
相關文章