Linux定時任務--Crond使用教程


Linux定時任務--Crond使用教程

1. 介紹Crond

crond是linux下用來周期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計划任務類似,當安裝完成操作系統后,默認會安裝此服務工具,並且會自動啟動crond進程,crond進程每分鍾會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。

Cron 是UNIX, SOLARIS,LINUX下的一個十分有用的工具。通過Cron腳本能使計划任務定期地在系統后台自動運行。這種計划任務在UNIX, SOLARIS, LINUX下術語為cron jobs。 Crontab (CRON 表)則是用來記錄在特定時間運行的CRON的一個腳本文件。

2. 控制Crond狀態的命令

crontab -l #查看任務
crontab -e  #便捷定時編輯任務
systemctl reload crond.service #重啟crontab
systemctl start crond.service 
systemctl stop crond.service
systemctl restart crond.service

# 如果不支持systemctl命令
    service crond start    //啟動服務
    service crond stop     //關閉服務
    service crond restart  //重啟服務
    service crond reload   //重新載入配置
    service crond status   //查看服務狀態 
/sbin/service crond start //啟動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啟服務
/sbin/service crond reload //重新載入配置


# 設置Crond開機是否自啟
# 1. 查看crond.serivce服務的自啟動狀態
systemctl is-enabled crond/crond.service
> disabled
# 1.1 此時crond.serivce的自啟動狀態為disabled [開機不會自啟動]
# 1.2 如果時enabled,表示自啟動狀態為enabled  [開機會自啟動]

# 開啟crond.serivce服務自啟動
systemctl enable crond/crond.service
systemctl is-enabled crond/crond.service
> enabled

# 列出所有的啟動文件:
systemctl list-unit-files

# 列出所有狀態為enable的啟動文件
systemctl list-unit-files | grep enable

# 關閉crond.serivce的自啟動狀態
systemctl disable crond/crond.service

3. 權限控制

為了安全性,可以限制使用crontab的用戶賬號,使用的限制數據:
/etc/cron.allow
將可以使用的crontab的賬號寫入其中,若不在這個文件內的用戶則不可使用crontab

/etc/cron.deny
將不可使用crontab的賬號寫入其中,若未記錄到這個文件當中的用戶,就可以使用crontab。

以優先級來說,/etc/cron.allow/etc/cron.deny要優先,一般來說,建議只保留一個即可,系統默認是保留/etc/cron.deny

當用戶使用crontab這個命令新建工作調度之后,這項工作就會被記錄到/var/spool/cron/里面,而且以該賬號來判別的。
舉例:tom 使用crontab后,他的工作會被記錄到/var/spool/cron/tom里面去。也就是說/var/spool/cron/tom 記錄了,tom用戶編輯的定時任務。

cron執行的每一項工作都會被記錄到/var/log/cron這個日志文檔中;

Java程序輸出在Console中的日志也會打印到/var/log目錄中的message文件中

4. Crontab命令

時間段分別代表的含義
0 12 * * *
分 時 日 月 周

不能使用vi直接編輯該文件,因為可能由於輸入語法錯誤,會導致無法執行cron。
使用crontab -e 命令來編輯

每項工作(每行)的格式都是具有六個字段,這六個字段的意義如下表:

command 一般我們用的是可執行的shell文件

比較有趣的是那個”周”,周的數字為0或7時,代表的是星期天的意思。
下圖介紹一下輔助的字符

![](https://img2020.cnblogs.com/blog/1129285/202007/1129285-20200711215807181-27280894.png

例子

5. 系統的配置文件:/etc/crontab

crontab -e 命令是針對用戶的cron設計的,如果是系統的例行性任務時,就需要系統的配置文件/etc/crontab
其實 crontab -e 其實是/usr/bin/crontab這個文件,而etc/crontab 是系統的配置文件

看這個文件內容 其實與剛才的crontab -e 的內容幾乎一樣,但是還有幾個地方不一樣

1、MAILTO=root

這個選項的意思是說,當 /etc/crontab 這個檔案中的例行性命令發生錯誤時,會將錯誤訊息或者是屏幕顯示的訊息傳給誰?由於 root 並無法再用戶端收信,因此,我通常都將這個 e-mail 改成自己的賬號,好讓我隨時了解系統的狀態!

2、PATH=….
這里就是輸入執行文件的查找路徑,使用默認的路徑設置就已經很足夠了。

3、01 * * * * root run-parts /etc/cron.hourly:

在 #run-parts 這一行以后的命令,我們可以發現,五個數字后面接的是 root ,這一行代表的是『執行的級別為root身份』當然,你也可以將這一行改為成其他的身份!而 run-parts代表后面接的 /etc/cron.hourly 是『一個目錄內(/etc/cron.hourly)的所有可執行文件』,也就是說,每個小時的01分,系統會以root身份去/etc/cron.hourly這個目錄下執行所有可執行的文件!后面三行也是類似的意思!你可以到 /etc/ 底下去看看,系統本來就預設了這4個目錄!你可以將每天需要執行的命令直接寫到/etc/cron.daily即可,還不需要使用到crontab -e的程式!

舉例:


注意:周與日、月不可同時並存

6. 定時任務腳本輸出內容重定向

如果crontab不重定向輸出,並且crontab所執行的命令有輸出內容的話,是一件非常危險的事情。因為該輸出內容會以郵件的形式發送給用戶,內容存儲在郵件文件

/var/spool/mail/$user

如果命令執行比較頻繁(如每分鍾一次),或者命令輸出內容較多,會使這個郵件文件不斷追加內容,文件越來越大。而郵件文件一般存放在根分區,根分區一般相對較小,所以會造成根分區寫滿而無法登錄服務器。

所以在添加crontab命令時,無論命令是否有輸出,最好都加上輸出重定向到文件或者/dev/null中。如下

*/5 * * * * /root/XXXX.sh &>/dev/null 2>&1
`感覺上面的語句應該改有問題,應該使用下面的語句`
*/5 * * * * /root/XXXX.sh 1>/dev/null 2>&1

輸出內容寫入文件的兩種方式:
追加: echo " " >> 文件名

覆蓋: echo " " > 文件名

/dev/null 代表空設備文件

> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout標准輸出,系統默認值是1,所以">/dev/null"等同於"1>/dev/null"
2 表示stderr標准錯誤
& 表示等同於的意思,2>&1,表示2的輸出重定向等同於1

那么>/dev/null 2>&1的意思就是:
標准輸出重定向到空設備文件,也就是不輸出任何信息到終端,標准錯誤輸出重定向等同於標准輸出,因為之前標准輸出已經重定向到了空設備文件,所以標准錯誤輸出也重定向到空設備文件。

我們也可以將我們通過定時任務執行的腳本的輸出內容,輸出到文件

# 定時任務配置
*/1 * * * *  /var/spool/cron/bash/test.sh >> /var/spool/cron/bash/test.log

# test.sh 文件內容
#!/bin/bash
echo "hello crond"

# test.log
hello crond
hello crond
hello crond
hello crond
hello crond
hello crond
......

7. 常用列子

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重啟apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重啟apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重啟apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之間每隔30分鍾重啟apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重啟apache。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小時重啟apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11點到早上7點之間,每隔一小時重啟apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4號與每周一到周三的11點重啟apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一號的4點重啟apache

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM