前言:大部分時(shí)候,我們都希望進(jìn)程快點(diǎn)開始,開點(diǎn)結(jié)束,別卡。而 shell 的執(zhí)行,也是在前一個(gè)命令后,馬上接著執(zhí)行下一個(gè)命令。命令完成的速度是與資源的限制有關(guān),且不在 shell 的權(quán)限下。
在交談模式中使用下,有時(shí)不必等到命令完成才能執(zhí)行另一個(gè)。這是 shell 提供的一個(gè)簡(jiǎn)單方式:所有的命令只要在最后加上 & 字符,都可起始于后臺(tái)執(zhí)行,無(wú)需等待。只有在少數(shù)情況下,必須等待后臺(tái)進(jìn)程完成。
稍稍有四種情況需要延時(shí)進(jìn)程其實(shí),知道未來(lái)的某個(gè)事件才執(zhí)行。
第一種 sleep
sleep 命令常用于在 shell 腳本中延遲時(shí)間
常用方式:
格式:sleep<n>
格式:sleep<n>s
作用效果:延遲
格式:sleep<n>m
作用效果:延遲 n 分鐘
格式:sleep<n>h
作用效果:延遲 n 小時(shí)
格式:sleep<n>d
作用效果:延遲 n 天
注意:
案例
\# date;sleep 5;date
2015 年 07 月 29 日 星期三 15:40:32 CST 2015 年 07 月 29 日 星期三 15:40:37 CST
at:延遲至特定時(shí)間
在 win 系統(tǒng)中,win 提供了計(jì)劃任務(wù)這一功能,在控制面板 -> 性能與維護(hù) -> 任務(wù)計(jì)劃,它的功能就是安排自動(dòng)運(yùn)行的任務(wù)。通過” 添加任務(wù)計(jì)劃” 的一步步引導(dǎo),則可建立一個(gè)定時(shí)執(zhí)行的任務(wù)。
在 linux 系統(tǒng)中你可能已經(jīng)發(fā)現(xiàn)為什么系統(tǒng)常常會(huì)自動(dòng)的進(jìn)行一些任務(wù)? 這些任務(wù)到底是誰(shuí)在支配他們工作的? 在 linux 系統(tǒng)如果你想讓自己設(shè)計(jì)的備份程序可以自動(dòng)的在某個(gè)時(shí)間點(diǎn)開始在系統(tǒng)低下運(yùn)行,而不需要收到啟動(dòng)它,又該如何處置呢? 這些例行的工作可能又分為一次性定時(shí)工作與循環(huán)定時(shí)工作,在系統(tǒng)內(nèi)有時(shí)那些服務(wù)在負(fù)責(zé)? 還有,如果你想要在每天的老婆過生日的時(shí)候送份禮物,一個(gè)老婆可能還好說(shuō),如果一多了,容易記不住,還容易記混了。
進(jìn)入正題
at 命令的格式:
at [參數(shù)] [時(shí)間]
功能:在一個(gè)指定的時(shí)間指定一個(gè)指定任務(wù),只能執(zhí)行一次,且需要開啟 atd 進(jìn)程。
備注:先使用 ps -ef | grep atd 查看,開啟用 /etc/init.d/atd start 或者 /etc/init.d/atd restart;開機(jī)自啟動(dòng):chkconfig --level 2345 atd on
參數(shù):
```名稱 說(shuō)明 -m 當(dāng)指定的任務(wù)被完成之后,將給用戶發(fā)送郵件,即使沒有標(biāo)準(zhǔn)輸出 -I atq 的別名 -d atrm 的別名 -v 顯示任務(wù)將被執(zhí)行的時(shí)間 -c 打印任務(wù)的任榮到標(biāo)準(zhǔn)輸出 -V 顯示版本信息 -q< 隊(duì)列 > 使用指定的隊(duì)列 -f< 文件 > 從指定文件讀入任務(wù)而不是從標(biāo)準(zhǔn)輸入讀入 -t< 時(shí)間參數(shù) > 以時(shí)間參數(shù)的形式提交要運(yùn)行的任務(wù)
`at` 允許使用一套相當(dāng)復(fù)雜的指定時(shí)間的方法。他能夠接受在當(dāng)天的 hh:mm(小時(shí):分鐘)式的時(shí)間指定。假如該時(shí)間已過去,那么就放在第二天執(zhí)行。當(dāng)然也能夠使用 midnight(深夜),noon(中午),teatime(飲茶時(shí)間,一般是下午 4 點(diǎn))等比較模糊的 詞語(yǔ)來(lái)指定時(shí)間。用戶還能夠采用 12 小時(shí)計(jì)時(shí)制,即在時(shí)間后面加上 AM(上午)或 PM(下午)來(lái)說(shuō)明是上午還是下午。也能夠指定命令執(zhí)行的具體日期,指定格式為 month day(月 日)或 mm/dd/yy(月 / 日 / 年)或 dd.mm.yy(日. 月. 年)。指定的日期必須跟在指定時(shí)間的后面。上面介紹的都是絕對(duì)計(jì)時(shí)法,其實(shí)還能夠使用相對(duì)計(jì)時(shí)法,這對(duì)于安排不久就要執(zhí)行的命令是很有好處的。
指定格式為:`now + count time-units ,now` 就是當(dāng)前時(shí)間,time-units 是時(shí)間單位,這里能夠是 minutes(分鐘)、hours(小時(shí))、days(天)、weeks(星期)。count 是時(shí)間的數(shù)量,究竟是幾天,還是幾小時(shí),等等。更有一種計(jì)時(shí)方法就是直接使用 today(今天)、tomorrow(明天)來(lái)指定完成命令的時(shí)間。
TIME:時(shí)間格式,這里可以定義出什么時(shí)候要進(jìn)行 at 這項(xiàng)任務(wù)的時(shí)間,格式有:
`HH:MM`
`ex> 04:00`
在今日的 HH:MM 時(shí)刻進(jìn)行,若該時(shí)刻已超過,則明天的 HH:MM 進(jìn)行此任務(wù)。
`HH:MM YYYY-MM-DD`
`ex> 04:00 2009-03-17 `
強(qiáng)制規(guī)定在某年某月的某一天的特殊時(shí)刻進(jìn)行該項(xiàng)任務(wù)
`HH:MM[am|pm] [Month] [Date] `
`ex> 04pm March 17 `
也是一樣,強(qiáng)制在某年某月某日的某時(shí)刻進(jìn)行該項(xiàng)任務(wù)
`HH:MM[am|pm] + number [minutes|hours|days|weeks] `
`ex> now + 5 minutes`
`ex> 04pm + 3 days `
就是說(shuō),在某個(gè)時(shí)間點(diǎn)再加幾個(gè)時(shí)間后才進(jìn)行該項(xiàng)任務(wù)。
案例:三天后的下午五點(diǎn)鐘執(zhí)行 `/bin/ls`
```\#at 5pm+3days
at> /bin/ls
at><EOT>
job 7 at 2015-07-28 17:00
案例 2:明天 17 點(diǎn)鐘,輸出時(shí)間到指定文件中
\#at 17:20 tomorrow at> date>/root/2015.log at> <EOT>(輸入完成需要按下 Ctrl+D 鍵) job 8 at 2015-07-28 17:00
案例 3:計(jì)劃任務(wù)設(shè)定后,在沒有執(zhí)行之前我們可以用 atq 命令來(lái)查看系統(tǒng)沒有執(zhí)行工作任務(wù)命令:
\#atq
案例 4:刪除已經(jīng)設(shè)置的任務(wù)
\#atrm 7
詳情
\#atq // 先使用 atq 命令查看當(dāng)前系統(tǒng)設(shè)置的任務(wù) 8 2015-07-28 17:00 a root 7 2015-07-28 17:00 a root \#atrm 7 // 刪除設(shè)置的任務(wù) \#atq // 查看任務(wù) 8 2015-07-28 17:00 a root
案例 5:顯示已經(jīng)設(shè)置的任務(wù)內(nèi)容
\#at -c 8
atd 的啟動(dòng)與 at 運(yùn)行的方式:
atd 的啟動(dòng)
要使用一次性計(jì)劃任務(wù)時(shí),我們的 linux 系統(tǒng)上面必須要有負(fù)責(zé)這個(gè)計(jì)劃任務(wù)的服務(wù),那就是 atd 服務(wù)。不過并不是所有的 linux 發(fā)行版本都是默認(rèn)把它打開的,所以,某些時(shí)刻我們需要手動(dòng)將 atd 服務(wù)激活才行。
激活的方式如下:
\#/etc/init.d/atd start 或者#/etc/init.d/atd restart
停止 atd:\#/etc/init.d/atd stop
備注:設(shè)置一下自啟動(dòng):\#chkconfig atd on
at 的運(yùn)行方式
既然是計(jì)劃任務(wù),那么應(yīng)該會(huì)有任務(wù)執(zhí)行的方式,并且將這些任務(wù)排進(jìn)行程表中。那么產(chǎn)生計(jì)劃任務(wù)的方式是怎么進(jìn)行的? 事實(shí)上,我們使用 at 這個(gè)命令來(lái)產(chǎn)生所要運(yùn)行的計(jì)劃任務(wù),并將這個(gè)計(jì)劃任務(wù)以文字檔的方式寫入 /var/spool/at/ 目錄內(nèi),該工作便能等待 atd 這個(gè)服務(wù)的取用與運(yùn)行了。就這么簡(jiǎn)單。
不過,并不是所有的人都可以進(jìn)行 at 計(jì)劃任務(wù)。為什么? 因?yàn)橄到y(tǒng)安全的原因。很多主機(jī)被所謂的攻擊破解后,最常發(fā)現(xiàn)的就是他們的系統(tǒng)當(dāng)中多了很多的黑客程序,這些程序非??赡苓\(yùn)用一些計(jì)劃任務(wù)來(lái)運(yùn)行或搜集你的系統(tǒng)運(yùn)行信息,并定時(shí)的發(fā)送給黑客。所以,除非是你認(rèn)可的帳號(hào),否則先不要讓他們使用 at 命令。那怎么達(dá)到使用 at 的可控呢?
我們可以利用 /etc/at.allow 與 /etc/at.deny 這兩個(gè)文件來(lái)進(jìn)行 at 的使用限制。加上這兩個(gè)文件后,at 的工作情況是這樣的:
/etc/at.allow 這個(gè)文件,寫在這個(gè)文件中的使用者才能使用 at ,沒有在這個(gè)文件中的使用者則不能使用 at (即使沒有寫在 at.deny 當(dāng)中);/etc/at.allow 不存在,就尋找 /etc/at.deny 這個(gè)文件,若寫在這個(gè) at.deny 的使用者則不能使用 at ,而沒有在這個(gè) at.deny 文件中的使用者,就可以使用 at 命令了。root 可以使用 at 這個(gè)命令。透過這個(gè)說(shuō)明,我們知道 /etc/at.allow 是管理較為嚴(yán)格的方式,而 /etc/at.deny 則較為松散 (因?yàn)閹ぬ?hào)沒有在該文件中,就能夠運(yùn)行 at 了)。在一般的 distributions 當(dāng)中,由于假設(shè)系統(tǒng)上的所有用戶都是可信任的,因此系統(tǒng)通常會(huì)保留一個(gè)空的 /etc/at.deny 文件,意思是允許所有人使用 at 命令的意思 (您可以自行檢查一下該文件)。不過,萬(wàn)一你不希望有某些使用者使用 at 的話,將那個(gè)使用者的帳號(hào)寫入 /etc/at.deny 即可! 一個(gè)帳號(hào)寫一行。
batch:為資源控制而延遲
跟 at 一樣也是定期執(zhí)行的命令,使用方法也跟 at 相同,但是不同的是 batch 不需要指定時(shí)間,因?yàn)樗鼤?huì)自動(dòng)在系統(tǒng)負(fù)載比較低的時(shí)候執(zhí)行(平均負(fù)載小于 0.8 的時(shí)候)
crontab:在指定時(shí)間再執(zhí)行
上面詳細(xì)說(shuō)了 at 命令的用法,循環(huán)運(yùn)行的例行性計(jì)劃任務(wù),linux 系統(tǒng)則是由 cron(crond)
這個(gè)系統(tǒng)服務(wù)來(lái)控制的.linux 系統(tǒng)上面原本就有非常多的計(jì)劃性工作,因此這個(gè)系統(tǒng)服務(wù)是默認(rèn)啟動(dòng)的。另外,由于使用者自己也可以設(shè)置計(jì)劃任務(wù),所以,linux 系統(tǒng)也提供了使用者控制計(jì)劃任務(wù)的命令:crontab 命令。
crond 簡(jiǎn)介
crond 四 linux 下用來(lái)周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個(gè)守護(hù)進(jìn)程,與 windows 下的計(jì)劃任務(wù)類似,當(dāng)安裝完成操作系統(tǒng)后,默認(rèn)會(huì)安裝此項(xiàng)服務(wù),并且會(huì)自啟動(dòng) crond 進(jìn)程,crond 進(jìn)程每分鐘會(huì)定期檢查是否又要執(zhí)行的任務(wù),如果有要執(zhí)行的文物,則會(huì)自動(dòng)執(zhí)行該任務(wù)。
linux 下的任務(wù)調(diào)度分為兩類,系統(tǒng)任務(wù)調(diào)度和用戶任務(wù)調(diào)度
系統(tǒng)任務(wù)調(diào)度;系統(tǒng)周期性所要執(zhí)行的工作,比如寫緩存數(shù)據(jù)到硬盤,日志清理。在 /etc 目錄下有一個(gè) crontab 文件,這個(gè)就是系統(tǒng)任務(wù)調(diào)度的配置文件。下面我們來(lái)看一下 /etc/crontab 這個(gè)文件:
\# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ \ \# For details see man 4 crontabs \ \# Example of job definition: \# .---------------- minute (0 - 59) \# | .------------- hour (0 - 23) \# | | .---------- day of month (1 - 31) \# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... \# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat \# | | | | | \# * * * * * user-name command to be executed
前四行是用來(lái)配置 crond 任務(wù)運(yùn)行的環(huán)境變量,第一行 shell 變量指定了系統(tǒng)要使用那個(gè) shell,這里是 ba 是,第二行 PATH 變量指定了系統(tǒng)執(zhí)行命令的路徑,第三行 MAILTO 變量指定了 crond 的任務(wù)執(zhí)行信息將通過電子郵件發(fā)送給 root 用戶,如果 MAILTO 變量的值為空,則表示不發(fā)送任務(wù)執(zhí)行信息給用戶,第四行的 HOME 變量指定了在執(zhí)行命令或腳本時(shí)使用的主目錄。
用戶任務(wù)調(diào)度:用戶定期要執(zhí)行的工作,比如用戶數(shù)據(jù)備份,定是郵件提醒等。用戶可以使用 crontab 工具來(lái)定制自己的計(jì)劃任務(wù),所有用戶定義的 crontab 文件都被保存在 /var/spool/cron 目錄中。其文件名和用戶名一致。
使用者權(quán)限文件:
文件:
/etc/cron.deny // 該文件中國(guó)所列出的用戶不能使用 crontab 命令
文件:
/etc/cron/allow // 該文件中所列出用戶允許使用 crontab 命令
文件:
/etc/spool/cron // 所有用戶 crontab 文件存放的目錄,以用戶名命名
crontab 文件的含義:
用戶所建立的 crontab 文件中,每一行都代表一項(xiàng)任務(wù),每行的每個(gè)字段代表一項(xiàng)設(shè)置,他的格式分為六個(gè)字段,前五個(gè)字段是時(shí)間設(shè)定段,第六個(gè)字段是要執(zhí)行的命令字段,格式如下:
minute hour day month week command
其中:
minute:表示分鐘,可以是從 0 到 59 之間的任何整數(shù)。hour:表示小時(shí),可以是從 0 到 23 之間的任何整數(shù)。day:表示日期,可以是從 1 到 31 之間的任何整數(shù)。month:表示月份,可以是從 1 到 12 之間的任何整數(shù)。week:表示星期幾,可以是從 0 到 7 之間的任何整數(shù),這里的 0 或 7 代表星期日。command:要執(zhí)行的命令,可以是系統(tǒng)命令,也可以是自己編寫的腳本文件。http://wiki.jikexueyuan.com/project/learn-shell/images/2.png" alt="" />
在以上各個(gè)字段中,還可以使用以下特殊字段:
crond 服務(wù)
安裝 crontab:
\#yum install crontabs
服務(wù)操作說(shuō)明:
\#/sbin/service crond start // 啟動(dòng)服務(wù) \#/sbin/service crond stop // 關(guān)閉服務(wù) \#/sbin/service crond restart // 重啟服務(wù) \#/sbin/service crond reload // 重新載入配置
查看 crontab 服務(wù)狀態(tài):
\#service crond status
手動(dòng)啟動(dòng) crontab 服務(wù):
\#service crond start
查看 crontab 服務(wù)是否已設(shè)置為開機(jī)啟動(dòng),執(zhí)行命令:
\#ntsysv
加入開機(jī)自動(dòng)啟動(dòng):
\#chkconfig –level 35 crond on
crontab 詳解
格式:
crontab [-u user] file crontab [-u user] [-e | -l |-r]
功能:
通過 crontab 命令,我們可以在固定的間隔時(shí)間執(zhí)行指定的系統(tǒng)指令或 shell 腳本。時(shí)間間隔的單位可以是分鐘,小時(shí),日,月。周以及以上的任意組合。這個(gè)命令社嘗試和周期性的日志分析或數(shù)據(jù)備份等工作。
參數(shù):
```選項(xiàng)名
說(shuō)明
-u user
用來(lái)設(shè)定某個(gè)用戶的 crontab 服務(wù),例如”-u syx” 表示設(shè)定 syx 用戶的 crontab 服務(wù),這個(gè)參數(shù)一般有 root 用戶來(lái)運(yùn)行
file
file 是命令文件的名字,表示將 file 作為 crontab 的任務(wù)列表問價(jià)并載入 crontab。如果在命令行中沒有指定這個(gè)文件,crontab 命令將接受標(biāo)準(zhǔn)輸入 (鍵盤) 上鍵入的命令,并將它們載入 crontab
-e
編輯某個(gè)用戶的 crontab 文件內(nèi)容。如果不指定用戶,則表示編輯當(dāng)前用戶的 crontab 文件。
-l
顯示某個(gè)用戶的 crontab 文件內(nèi)容,如果不指定用戶,則表示顯示當(dāng)前用戶的 crontab 文件內(nèi)容
-r
從 /var/spool/cron 目錄中刪除某個(gè)用戶的 crontab 文件,如果不指定,你猜結(jié)果怎樣?
-i
在刪除用戶的 crontan 文件時(shí)給確認(rèn)提示。
**常用方法**
1. **創(chuàng)建一個(gè)新的 crontab 文件**
在考慮向 `cron` 進(jìn)程提交一個(gè) `crontab` 文件時(shí),首先要做的一件事情就是設(shè)置環(huán)境變量 `EDITOR`。`cron` 進(jìn)程根據(jù)它來(lái)確定使用哪個(gè)編輯器編輯 `crontab` 文件。99% 的 linux 用戶都是用 `vi`,如果你也是這樣那么你就編輯 $HOME 目錄下`.profile` 文件 (如果沒有,就是`.bash_profile` 文件),在其中加入這樣一行:`EDITOR=vi;export EDITOR` 然后保存退出。不妨創(chuàng)建一個(gè)名為 `<user>cron` 的文件,其中 <user> 是用戶名,例如,syxcron。在該文件中加入如下的內(nèi)容
```\# (put your own initials here)echo the date to the console every
`# 15minutes between 6pm and 6am
0,15,30,45 * * * * /bin/echo 'date' > /dev/console```
保存并退出。確保前面五個(gè)域用空格分隔。
在上面的例子中,系統(tǒng)每個(gè) 15 分鐘向控制臺(tái)輸出依次當(dāng)前時(shí)間。如果系統(tǒng)崩潰或掛起,從最后所顯示的時(shí)間就可以一眼看出系統(tǒng)是什么時(shí)間停止工作的。在有些系統(tǒng)中,用 tty1 來(lái)表示控制臺(tái)??梢愿鶕?jù)實(shí)際情況對(duì)上面的粒子進(jìn)行相應(yīng)的修改。為了提交你剛剛創(chuàng)建的 crontab 文件,可以把這個(gè)新創(chuàng)建的文件作為 cron 命令參數(shù)。
`\#crontab syxcron`
現(xiàn)在該文件已經(jīng)提交給 cron 進(jìn)程,它每隔十五分鐘運(yùn)行一次。
同時(shí),新創(chuàng)建的文件的一個(gè)副本已經(jīng)被放在 /var/spool/cron 目錄中,文件名就是用戶名 (即 syx)
注意:這里容易出現(xiàn) “bad minute” 及 “errors in crontab file,can't install” 錯(cuò)誤。經(jīng)確認(rèn),根本原因是 crontab 文件中時(shí)間格式定義不正確導(dǎo)致的。
- crontab 時(shí)間格式內(nèi)容
```* * * * * command
M H D m d command
分 時(shí) 日 月 周 命令
第 1 列表示分鐘 1~59 每分鐘用 * 或者 */1 表示
第 2 列表示小時(shí) 1~23(0 表示 0 點(diǎn))
第 3 列表示日期 1~31
第 4 列表示月份 1~12
第 5 列標(biāo)識(shí)號(hào)星期 0~6(0 表示星期天)
第 6 列要運(yùn)行的命令或腳本內(nèi)容
如果能掌握這個(gè) crontab 的時(shí)間格式的定義,基本上就會(huì)避免出現(xiàn) “bad minute” 錯(cuò)誤。
列出 crontab 文件
為了列出 crontab 文件,可以用:
\#crontab -l // 你覺得這里要是數(shù)字 1 有意義嗎?
如果你跟著我做了這個(gè)案例,你就會(huì)看到和上面的內(nèi)容一樣:0,15,30,45 * * * * /bin/echo 'date' > /dev/console
使用這種方法可以在 $HOME 目錄中對(duì) crontab 文件做一份備份:
\#crontab -l >$HOME/mycron
編輯 crontab 文件
如果希望添加,刪除或修改 crontab 文件中的條目,而 EDITOR 環(huán)境變量有舍值為 vi,可以使用 vi 來(lái)編輯 crontab 文件,命令:
\#crontab -e
可以像使用 vi 編輯其他任何文件那樣修改 crontab 文件并退出。如果修改了某些條目或添加了新的條目,那么在保存該文件時(shí),cron 會(huì)對(duì)其進(jìn)行必要的完整性檢查。如果其中的某個(gè)域出現(xiàn)超出 = 允許范圍的值,他就會(huì)提示你,我們?cè)诰庉?crontab 文件時(shí),沒準(zhǔn)會(huì)加入新的條目。例如,加入下面一條:
\# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;
現(xiàn)在保存并退出。最好在 crontab 文件的每一個(gè)條目之上加入一條注釋,這樣就可以知道它的功能、運(yùn)行時(shí)間,更為重要的是,知道這是哪位用戶的作業(yè)。
現(xiàn)在讓我們使用前面講過的 crontab -l 命令列出它的全部信息:
$ crontab -l \# (crondave installed on Tue May 4 13:07:43 1999) \# DT:ech the date to the console every 30 minites 0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1 \# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;
刪除 crontab 文件
要?jiǎng)h除 crontab 文件,可以用:\#crontab -r
恢復(fù)丟失的 crontab 文件
如果不小心誤刪了 crontab 文件,假設(shè)你在自己的 $HOME 目錄下還有一個(gè)備份,那么可以將其拷貝到 /var/spool/cron/<username>,其中 <username> 是用戶名。如果由于權(quán)限問題無(wú)法完成拷貝,可以用:$crontab <filename>
其中,$ HOME 目錄中副本的文件名。
我建議你在自己的 $HOME 目錄中保存一個(gè)該文件的副本。我就有過類似的經(jīng)歷,有數(shù)次誤刪了 crontab 文件(因?yàn)?r 鍵緊挨在 e 鍵的右邊)。這就是為什么有些系統(tǒng)文檔建議不要直接編輯 crontab 文件,而是編輯該文件的一個(gè)副本,然后重新提交新的文件。
有些 crontab 的變體有些怪異,所以在使用 crontab 命令時(shí)要格外小心。如果遺漏了任何選項(xiàng),crontab 可能會(huì)打開一個(gè)空文件,或者看起來(lái)像是個(gè)空文件。這時(shí)敲 delete 鍵退出,不要按
實(shí)例 1:每 1 分鐘執(zhí)行一次 command
命令:
* * * * * command
實(shí)例 2:每小時(shí)的第 3 和第 15 分鐘執(zhí)行
命令:
3,15 * * * * command
實(shí)例 3:在上午 8 點(diǎn)到 11 點(diǎn)的第 3 和第 15 分鐘執(zhí)行
命令:
3,15 8-11 * * * command
實(shí)例 4:每隔兩天的上午 8 點(diǎn)到 11 點(diǎn)的第 3 和第 15 分鐘執(zhí)行
命令:
3,15 8-11 */2 * * command
實(shí)例 5:每個(gè)星期一的上午 8 點(diǎn)到 11 點(diǎn)的第 3 和第 15 分鐘執(zhí)行
命令:
3,15 8-11 * * 1 command
實(shí)例 6:每晚的 21:30 重啟 smb
命令:
30 21 * * * /etc/init.d/smb restart
實(shí)例 7:每月 1、10、22 日的 4 :45 重啟 smb
命令:
45 4 1,10,22 * * /etc/init.d/smb restart
實(shí)例 8:每周六、周日的 1 :10 重啟 smb
命令:
10 1 * * 6,0 /etc/init.d/smb restart
實(shí)例 9:每天 18 :00 至 23 :00 之間每隔 30 分鐘重啟 smb
命令:
0,30 18-23 * * * /etc/init.d/smb restart
實(shí)例 10:每星期六的晚上 11 :00 pm 重啟 smb
命令:
0 23 * * 6 /etc/init.d/smb restart
實(shí)例 11:每一小時(shí)重啟 smb
命令:
* */1 * * * /etc/init.d/smb restart
實(shí)例 12:晚上 11 點(diǎn)到早上 7 點(diǎn)之間,每隔一小時(shí)重啟 smb
命令:
* 23-7/1 * * * /etc/init.d/smb restart
實(shí)例 13:每月的 4 號(hào)與每周一到周三的 11 點(diǎn)重啟 smb
命令:
0 11 4 * mon-wed /etc/init.d/smb restart
實(shí)例 14:一月一號(hào)的 4 點(diǎn)重啟 smb
命令:
0 4 1 jan * /etc/init.d/smb restart
實(shí)例 15:每小時(shí)執(zhí)行 /etc/cron.hourly 目錄內(nèi)的腳本
命令:
01 * * * * root run-parts /etc/cron.hourly
說(shuō)明:
run-parts 這個(gè)參數(shù)了,如果去掉這個(gè)參數(shù)的話,后面就可以寫要運(yùn)行的某個(gè)腳本名,而不是目錄名了
使用注意事項(xiàng)
注意環(huán)境變量問題
有時(shí)我們創(chuàng)建了一個(gè) crontab,但是這個(gè)任務(wù)卻無(wú)法自動(dòng)執(zhí)行,而手動(dòng)執(zhí)行這個(gè)任務(wù)卻沒有問題,這種情況一般是由于在 crontab 文件中沒有配置環(huán)境變量引起的。
在 crontab 文件中定義多個(gè)調(diào)度任務(wù)時(shí),需要特別注意的一個(gè)問題就是環(huán)境變量的設(shè)置,因?yàn)槲覀兪謩?dòng)執(zhí)行某個(gè)任務(wù)時(shí),是在當(dāng)前 shell 環(huán)境下進(jìn)行的,程序當(dāng)然能找到環(huán)境變量,而系統(tǒng)自動(dòng)執(zhí)行任務(wù)調(diào)度時(shí),是不會(huì)加載任何環(huán)境變量的,因此,就需要在 crontab 文件中指定任務(wù)運(yùn)行所需的所有環(huán)境變量,這樣,系統(tǒng)執(zhí)行任務(wù)調(diào)度時(shí)就沒有問題了。
不要假定 cron 知道所需要的特殊環(huán)境,它其實(shí)并不知道。所以你要保證在 shelll 腳本中提供所有必要的路徑和環(huán)境變量,除了一些自動(dòng)設(shè)置的全局變量。所以注意如下 3 點(diǎn):
source 命令引入環(huán)境變量,如:
cat start_cbp.sh \#!/bin/sh source /etc/profile export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf /usr/local/jboss-4.0.5/bin/run.sh -c mev &crontab 死活不執(zhí)行時(shí)。這時(shí)必須大膽懷疑是環(huán)境變量惹的禍,并可以嘗試在 crontab 中直接引入環(huán)境變量解決問題。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh注意清理系統(tǒng)用戶的郵件日志
每條任務(wù)調(diào)度執(zhí)行完畢,系統(tǒng)都會(huì)將任務(wù)輸出信息通過電子郵件的形式發(fā)送給當(dāng)前系統(tǒng)用戶,這樣日積月累,日志信息會(huì)非常大,可能會(huì)影響系統(tǒng)的正常運(yùn)行,因此,將每條任務(wù)進(jìn)行重定向處理非常重要。
例如,可以在 crontab 文件中設(shè)置如下形式,忽略日志輸出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
“/dev/null 2>&1” 表示先將標(biāo)準(zhǔn)輸出重定向到 /dev/null,然后將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出,由于標(biāo)準(zhǔn)輸出已經(jīng)重定向到了 /dev/null,因此標(biāo)準(zhǔn)錯(cuò)誤也會(huì)重定向到 /dev/null,這樣日志輸出問題就解決了。
系統(tǒng)級(jí)任務(wù)調(diào)度與用戶級(jí)任務(wù)調(diào)度
系統(tǒng)級(jí)任務(wù)調(diào)度主要完成系統(tǒng)的一些維護(hù)操作,用戶級(jí)任務(wù)調(diào)度主要完成用戶自定義的一些任務(wù),可以將用戶級(jí)任務(wù)調(diào)度放到系統(tǒng)級(jí)任務(wù)調(diào)度來(lái)完成(不建議這么做),但是反過來(lái)卻不行,root 用戶的任務(wù)調(diào)度操作可以通過 “crontab –uroot –e” 來(lái)設(shè)置,也可以將調(diào)度任務(wù)直接寫入 /etc/crontab 文件,需要注意的是,如果要定義一個(gè)定時(shí)重啟系統(tǒng)的任務(wù),就必須將任務(wù)放到 /etc/crontab 文件,即使在 root 用戶下創(chuàng)建一個(gè)定時(shí)重啟系統(tǒng)的任務(wù)也是無(wú)效的。
其他注意事項(xiàng)
新創(chuàng)建的 cron job,不會(huì)馬上執(zhí)行,至少要過 2 分鐘才執(zhí)行。如果重啟 cron 則馬上執(zhí)行。
當(dāng) crontab 突然失效時(shí),可以嘗試 /etc/init.d/crond restart 解決問題?;蛘卟榭慈罩究茨硞€(gè) job 有沒有執(zhí)行 / 報(bào)錯(cuò) tail -f /var/log/cron。
千萬(wàn)別亂運(yùn)行 crontab -r。它從 Crontab 目錄(/var/spool/cron)中刪除用戶的 Crontab 文件。刪除了該用戶的所有 crontab 都沒了。
在 crontab 中 % 是有特殊含義的,表示換行的意思。如果要用的話必須進(jìn)行轉(zhuǎn)義 \%,如經(jīng)常用的 date ‘+%Y%m%d’在 crontab 里是不會(huì)執(zhí)行的,應(yīng)該換成 date '+\%Y\%m\%d'。
簡(jiǎn)單的案例:http://www.ahlinux.com/start/cmd/20378.html