歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 計劃任務 Cron

Linux 計劃任務 Cron

日期:2017/2/28 13:48:59   编辑:Linux教程

難題

---每分鐘要執行某個程序檢查服務的運行
---每天要對數據進行備份
---每月要對日志進行備份
......
如果你也存在這樣的問題,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//Linux/2013-06/86401.htm

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

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

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

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

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

Copyright © Linux教程網 All Rights Reserved