Linux下設(shè)置定期執(zhí)行腳本
下面針對(duì)的是非ubuntu環(huán)境,會(huì)在文章末尾介紹ubuntu的一些區(qū)別。
在Linux下,經(jīng)常需要定期的執(zhí)行一些腳本從而來(lái)實(shí)現(xiàn)一些功能。
在Linux下我們用crontab來(lái)實(shí)現(xiàn)定期的執(zhí)行腳本這個(gè)功能,下面就介紹一下crontab的使用。以及我遇到的一些問(wèn)題
一. crontab的使用說(shuō)明
1. crond 是linux用來(lái)定期執(zhí)行程序的命令。當(dāng)安裝完成操作系統(tǒng)之后,默認(rèn)便會(huì)啟動(dòng)此任務(wù)調(diào)度命令。crond命令每分鐘會(huì)定期檢查是否有要執(zhí)行的工作,如果有要執(zhí)行的工作便會(huì)自動(dòng)執(zhí)行該工作。而linux任務(wù)調(diào)度的工作主要分為以下兩類(lèi)
a. 系統(tǒng)執(zhí)行的工作,比如垃圾清理,備份
b. 用戶(hù)自定義的工作,比如每5分鐘執(zhí)行一次腳本
2. crontab是UNIX系統(tǒng)下定期執(zhí)行任務(wù)的觸發(fā)器。用戶(hù)把要定期執(zhí)行的任務(wù)記錄在這個(gè)文件下面,然后crond定期的去檢查這個(gè)定期執(zhí)行列表,有要執(zhí)行的工作時(shí)便自動(dòng)執(zhí)行。
通過(guò)man crontab可以查看到下面的信息
a. /etc/crond.allow 表示的是允許使用crontab的用戶(hù)列表
b. /etc/crond.deny 表示的是不允許使用crontab的用戶(hù)列表
3. crontab常用的幾個(gè)命令格式
crontab -l //顯示用戶(hù)的crontab文件的內(nèi)容
crontab -e //編輯用戶(hù)的crontab文件的內(nèi)容
crontab -r //刪除用戶(hù)的crontab文件
4. crontab文件的基本格式如下所示
* * * * * command
分 時(shí) 天 月 周 命令
每列表示意義
a. ***個(gè)*表示的是分鐘1~59分鐘,默認(rèn)*表示的是每分鐘都執(zhí)行,x-y表示的是x~y這段每分鐘都執(zhí)行,*/n表示每n分鐘執(zhí)行一次,x,y,z表示的是x,y,z分鐘都執(zhí)行。
b. 第二個(gè)*表示的是小時(shí)1~23小時(shí),默認(rèn)*表示的是每小時(shí)都執(zhí)行,x-y表示的是x~y這段每小時(shí)都執(zhí)行,*/n表示每n小時(shí)執(zhí)行一次,x,y,z表示的是x,y,z小時(shí)都執(zhí)行。
c. 第三個(gè)*表示的是天1~31,默認(rèn)*表示的是每天都執(zhí)行,x-y表示的是x~y這段每天都執(zhí)行,*/n表示每n天執(zhí)行一次,x,y,z表示的是x,y,z天都執(zhí)行。
d. 第四個(gè)*表示的是月1~12,默認(rèn)*表示的是每個(gè)月都執(zhí)行,x-y表示的是x~y這個(gè)段每月都執(zhí)行,*/n表示每n分鐘執(zhí)行一次,x,y,z表示的是x,y,z天都執(zhí)行。
e. 第五個(gè)*表示的是周0~6(0表示周天),默認(rèn)周一~周天都執(zhí)行,x-y表示周x~周y每天都執(zhí)行。
5. crontab文件的一些例子
a. 30 21 * * * /usr/local/etc/rc.d/lighttpd restart //表示每天21:30重啟apache
b. 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart //表示每月1,10,22號(hào)4:45重啟apache
c. 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart //表示每天18 : 00至23 : 00之間每隔30分鐘重啟apache
d. * */1 * * * /usr/local/etc/rc.d/lighttpd restart //表示每一小時(shí)重啟apache
e. */5 * * * * /usr/local/etc/rc.d/lighttpd restart //表示每5分鐘重啟apache
二. 具體例子
1. 首先我在/home/chenguolin/tmp/ 創(chuàng)建一個(gè)shell腳本名為s.sh。注意腳本內(nèi)部的路徑使用絕對(duì)路徑。
這個(gè)腳本的功能就是把當(dāng)前的日期輸出重定向到當(dāng)前目錄下的out文件
2. 然后設(shè)置每2分鐘執(zhí)行一次這個(gè)腳本,>/dev/null 2>&1。原因是因?yàn)橄到y(tǒng)會(huì)在每次執(zhí)行完任務(wù)之后就發(fā)一個(gè)郵件告訴用戶(hù),通過(guò)這個(gè)操作可以把信息全部重定向到/dev/null中,/dev/null這個(gè)文件類(lèi)似回收站過(guò)一段時(shí)間系統(tǒng)自動(dòng)清理。
*/2 * * * * sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1
然后發(fā)現(xiàn)過(guò)了n個(gè)2分鐘,out文件根本就沒(méi)有輸出。
3. 在谷歌/百度無(wú)果之后,問(wèn)了同事,得到了原因是因?yàn)閏rontab可能有時(shí)候沒(méi)有辦法執(zhí)行用戶(hù)家目錄下面的兩個(gè)文件,分別是.bashrc和.bash_profile
這兩個(gè)文件的作用如下
.bashrc作用是用于你的bash shell的bash信息,當(dāng)?shù)卿洉r(shí)及每次打開(kāi)新的shell時(shí),該文件被讀??;
.bash_profile作用是每個(gè)用戶(hù)都可使用該文件輸入專(zhuān)用于自己使用的shell信息,當(dāng)用戶(hù)登錄時(shí),該文件僅僅執(zhí)行一次!默認(rèn)情況下,他設(shè)置一些環(huán)境變量,執(zhí)行用戶(hù)的.bashrc文件,
因此我們要手動(dòng)在crontab文件中添加source /home/chenguolin/.bashrc && source /home/chenguolin/.bash_profile
source的作用是當(dāng)前bash環(huán)境下執(zhí)行命令,而scripts是啟動(dòng)一個(gè)子shell來(lái)執(zhí)行命令。這樣如果把設(shè)置環(huán)境變量(或alias等等)的命令寫(xiě)進(jìn)scripts中,就只會(huì)影響子shell,無(wú)法改變當(dāng)前的BASH,所以通過(guò)文件(命令列)設(shè)置環(huán)境變量時(shí),要用source 命令。
因此crontab文件中變成
*/2 * * * * source && /home/chenguolin/.bashrc && source /home/chenguolin/.bash_profile && sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1
4. 發(fā)現(xiàn)可以定時(shí)的執(zhí)行腳本。
如果還不行,那只能通過(guò)查找log來(lái)查錯(cuò)。非ubuntu的Linux crond的日志文件保存在/var/log下
三. ubuntu下使用crontab定時(shí)執(zhí)行腳本
注意下幾個(gè)問(wèn)題以
1. ubuntu下crontab的服務(wù)程序是cron,并且默認(rèn)cron服務(wù)的log是沒(méi)有的,我們必須手動(dòng)開(kāi)啟
a. sudo vim /etc/rsyslog.d/50-default.conf
b. 找到cron.*那一行把注釋去掉
c. 然后重啟cron服務(wù) sudo service cron restart
d. 這樣就可以在/var/log里面發(fā)現(xiàn)有cron的日志文件了,我們就可以通過(guò)查看日志文件找到問(wèn)題所在
2. ubuntu下,用戶(hù)家目錄下是沒(méi)有.bash_profile文件的,并且會(huì)自動(dòng)去執(zhí)行.bashrc文件,只要寫(xiě)成下面這樣即可
*/2 * * * * sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1
原文鏈接:http://blog.csdn.net/chenguolinblog/article/details/37936865