鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)五十六天----延遲進程調(diào)度
shell 學(xué)習(xí)四十一天----列出文件 ls 和 od 命令
shell 學(xué)習(xí)小結(jié)
shell 學(xué)習(xí)第二十八天----case 語句
shell 學(xué)習(xí)四十四天----尋找文件
shell 學(xué)習(xí)三十五天----波浪號展開與通配符
shell 學(xué)習(xí)三十八天----執(zhí)行順序和 eval
shell 學(xué)習(xí)四十八天----文件校驗和匹配
shell 學(xué)習(xí)四十天----awk 的驚人表現(xiàn)
shell 學(xué)習(xí)第十一天----sed 正則的精確控制
shell 學(xué)習(xí)第十七天----awk 命令
shell 學(xué)習(xí)三十九天----內(nèi)建命令
shell 學(xué)習(xí)四十五天----xargs
shell 學(xué)習(xí)三十七天----引用
shell 學(xué)習(xí)第十六天----join 練習(xí)
shell 學(xué)習(xí)第二十四天----提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第九天----分組
shell 學(xué)習(xí)第五天----基本的 I/O 重定向
shell 學(xué)習(xí)第十五天----使用 cut 選定字段
shell 學(xué)習(xí)四十六天----文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)第八天----擴展正則表達式 (ERE)
shell 學(xué)習(xí)第十九天----文本塊排序
shell 學(xué)習(xí)第二十一天----重新格式化段落
shell 學(xué)習(xí)三十六天----命令替換
shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)四十二天----使用 touch 更新文件時間
shell 學(xué)習(xí)五十一天----top 命令查看進程列表
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)五十四天----進程系統(tǒng)調(diào)用的追蹤 strace
shell 學(xué)習(xí)五十天----查看進程 ps 命令
shell 學(xué)習(xí)第二十七天----退出狀態(tài)和 if 語句
shell 學(xué)習(xí)第二十三天----打印
shell 學(xué)習(xí)三十三天----關(guān)于重定向
shell 學(xué)習(xí)四十九天----進程建立
shell 學(xué)習(xí)第三十天----break,continue,shift,getopts
shell 學(xué)習(xí)五十五天----進程記賬
shell 學(xué)習(xí)總結(jié)一
shell 學(xué)習(xí)第二十六天----變量與算數(shù)
shell 學(xué)習(xí)第二十二天----計算行數(shù), 字數(shù)以及字符數(shù)
shell 學(xué)習(xí)五十八天----/proc 文件系統(tǒng)
shell 學(xué)習(xí)第二十五天----神器的管道符
shell 學(xué)習(xí)第三十二天----read 讀取一行
sheel 學(xué)習(xí)第三天
shell 學(xué)習(xí)----小結(jié)
shell 學(xué)習(xí)第十八天----文本排序
shell 學(xué)習(xí)第三十一天----函數(shù)問題
shell 學(xué)習(xí)第十天----sed 查找與替換
shell 學(xué)習(xí)四十三天----臨時性文件的建立與使用
shell 學(xué)習(xí)四十七天----文件比較 cmp,diff,patch
shell 學(xué)習(xí)三十四天----printf 詳解
shell 學(xué)習(xí)五十七天 ----linux 任務(wù)管理,針對上一講的總結(jié)和擴展
shell 學(xué)習(xí)第六天----小結(jié)
shell 學(xué)習(xí)第十三天----sed 案例分析
shell 學(xué)習(xí)第七天----基礎(chǔ)正則表達式 (BRE)
shell 學(xué)習(xí)第十二天----行與字符串
shell 學(xué)習(xí)小結(jié)四
shell 學(xué)習(xí)第二十九天----循環(huán)
shell 學(xué)習(xí)五十二天----刪除進程 kill 命令
shell 學(xué)習(xí)五十六天----延遲進程調(diào)度
shell 學(xué)習(xí)第四天----華麗的 printf 輸出
shell 學(xué)習(xí)第十五天----join 連接字段
shell 學(xué)習(xí)完結(jié)篇----希望你能看到
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)五十三天----捕獲信號 trap

shell 學(xué)習(xí)五十六天----延遲進程調(diào)度

延遲進程調(diào)度

前言:大部分時候,我們都希望進程快點開始,開點結(jié)束,別卡。而 shell 的執(zhí)行,也是在前一個命令后,馬上接著執(zhí)行下一個命令。命令完成的速度是與資源的限制有關(guān),且不在 shell 的權(quán)限下。

在交談模式中使用下,有時不必等到命令完成才能執(zhí)行另一個。這是 shell 提供的一個簡單方式:所有的命令只要在最后加上 & 字符,都可起始于后臺執(zhí)行,無需等待。只有在少數(shù)情況下,必須等待后臺進程完成。

稍稍有四種情況需要延時進程其實,知道未來的某個事件才執(zhí)行。

第一種 sleep
sleep 命令常用于在 shell 腳本中延遲時間

常用方式:
格式:sleep<n>
格式:sleep<n>s
作用效果:延遲

格式:sleep<n>m
作用效果:延遲 n 分鐘

格式:sleep<n>h 作用效果:延遲 n 小時

格式:sleep<n>d
作用效果:延遲 n 天

注意: 可以是小數(shù)

案例

\# date;sleep 5;date

2015 年 07 月 29 日 星期三 15:40:32 CST 2015 年 07 月 29 日 星期三 15:40:37 CST

at:延遲至特定時間

在 win 系統(tǒng)中,win 提供了計劃任務(wù)這一功能,在控制面板 -> 性能與維護 -> 任務(wù)計劃,它的功能就是安排自動運行的任務(wù)。通過” 添加任務(wù)計劃” 的一步步引導(dǎo),則可建立一個定時執(zhí)行的任務(wù)。

在 linux 系統(tǒng)中你可能已經(jīng)發(fā)現(xiàn)為什么系統(tǒng)常常會自動的進行一些任務(wù)? 這些任務(wù)到底是誰在支配他們工作的? 在 linux 系統(tǒng)如果你想讓自己設(shè)計的備份程序可以自動的在某個時間點開始在系統(tǒng)低下運行,而不需要收到啟動它,又該如何處置呢? 這些例行的工作可能又分為一次性定時工作與循環(huán)定時工作,在系統(tǒng)內(nèi)有時那些服務(wù)在負責(zé)? 還有,如果你想要在每天的老婆過生日的時候送份禮物,一個老婆可能還好說,如果一多了,容易記不住,還容易記混了。

進入正題

at 命令的格式:
at [參數(shù)] [時間]
功能:在一個指定的時間指定一個指定任務(wù),只能執(zhí)行一次,且需要開啟 atd 進程。

備注:先使用 ps -ef | grep atd 查看,開啟用 /etc/init.d/atd start 或者 /etc/init.d/atd restart;開機自啟動:chkconfig --level 2345 atd on

參數(shù):

```名稱 說明 -m 當(dāng)指定的任務(wù)被完成之后,將給用戶發(fā)送郵件,即使沒有標(biāo)準(zhǔn)輸出 -I atq 的別名 -d atrm 的別名 -v 顯示任務(wù)將被執(zhí)行的時間 -c 打印任務(wù)的任榮到標(biāo)準(zhǔn)輸出 -V 顯示版本信息 -q< 隊列 > 使用指定的隊列 -f< 文件 > 從指定文件讀入任務(wù)而不是從標(biāo)準(zhǔn)輸入讀入 -t< 時間參數(shù) > 以時間參數(shù)的形式提交要運行的任務(wù)


`at` 允許使用一套相當(dāng)復(fù)雜的指定時間的方法。他能夠接受在當(dāng)天的 hh:mm(小時:分鐘)式的時間指定。假如該時間已過去,那么就放在第二天執(zhí)行。當(dāng)然也能夠使用 midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午 4 點)等比較模糊的 詞語來指定時間。用戶還能夠采用 12 小時計時制,即在時間后面加上 AM(上午)或 PM(下午)來說明是上午還是下午。也能夠指定命令執(zhí)行的具體日期,指定格式為 month day(月 日)或 mm/dd/yy(月 / 日 / 年)或 dd.mm.yy(日. 月. 年)。指定的日期必須跟在指定時間的后面。上面介紹的都是絕對計時法,其實還能夠使用相對計時法,這對于安排不久就要執(zhí)行的命令是很有好處的。

指定格式為:`now + count time-units ,now` 就是當(dāng)前時間,time-units 是時間單位,這里能夠是 minutes(分鐘)、hours(小時)、days(天)、weeks(星期)。count 是時間的數(shù)量,究竟是幾天,還是幾小時,等等。更有一種計時方法就是直接使用 today(今天)、tomorrow(明天)來指定完成命令的時間。

TIME:時間格式,這里可以定義出什么時候要進行 at 這項任務(wù)的時間,格式有:  
`HH:MM`   
`ex> 04:00`  

在今日的 HH:MM 時刻進行,若該時刻已超過,則明天的 HH:MM 進行此任務(wù)。  
`HH:MM YYYY-MM-DD`   
`ex> 04:00 2009-03-17 ` 

強制規(guī)定在某年某月的某一天的特殊時刻進行該項任務(wù)  
`HH:MM[am|pm] [Month] [Date] `  
`ex> 04pm March 17 ` 

也是一樣,強制在某年某月某日的某時刻進行該項任務(wù)  
`HH:MM[am|pm] + number [minutes|hours|days|weeks] `   
`ex> now + 5 minutes`     
`ex> 04pm + 3 days `   
就是說,在某個時間點再加幾個時間后才進行該項任務(wù)。  

案例:三天后的下午五點鐘執(zhí)行 `/bin/ls`  
```\#at 5pm+3days
at> /bin/ls
at><EOT>
job 7 at 2015-07-28 17:00

案例 2:明天 17 點鐘,輸出時間到指定文件中
\#at 17:20 tomorrow at> date>/root/2015.log at> <EOT>(輸入完成需要按下 Ctrl+D 鍵) job 8 at 2015-07-28 17:00

案例 3:計劃任務(wù)設(shè)定后,在沒有執(zhí)行之前我們可以用 atq 命令來查看系統(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 的啟動與 at 運行的方式

atd 的啟動

要使用一次性計劃任務(wù)時,我們的 linux 系統(tǒng)上面必須要有負責(zé)這個計劃任務(wù)的服務(wù),那就是 atd 服務(wù)。不過并不是所有的 linux 發(fā)行版本都是默認把它打開的,所以,某些時刻我們需要手動將 atd 服務(wù)激活才行。

激活的方式如下:
\#/etc/init.d/atd start 或者#/etc/init.d/atd restart
停止 atd:\#/etc/init.d/atd stop
備注:設(shè)置一下自啟動:\#chkconfig atd on

at 的運行方式

既然是計劃任務(wù),那么應(yīng)該會有任務(wù)執(zhí)行的方式,并且將這些任務(wù)排進行程表中。那么產(chǎn)生計劃任務(wù)的方式是怎么進行的? 事實上,我們使用 at 這個命令來產(chǎn)生所要運行的計劃任務(wù),并將這個計劃任務(wù)以文字檔的方式寫入 /var/spool/at/ 目錄內(nèi),該工作便能等待 atd 這個服務(wù)的取用與運行了。就這么簡單。

不過,并不是所有的人都可以進行 at 計劃任務(wù)。為什么? 因為系統(tǒng)安全的原因。很多主機被所謂的攻擊破解后,最常發(fā)現(xiàn)的就是他們的系統(tǒng)當(dāng)中多了很多的黑客程序,這些程序非常可能運用一些計劃任務(wù)來運行或搜集你的系統(tǒng)運行信息,并定時的發(fā)送給黑客。所以,除非是你認可的帳號,否則先不要讓他們使用 at 命令。那怎么達到使用 at 的可控呢?

我們可以利用 /etc/at.allow/etc/at.deny 這兩個文件來進行 at 的使用限制。加上這兩個文件后,at 的工作情況是這樣的:

  • 先找尋 /etc/at.allow 這個文件,寫在這個文件中的使用者才能使用 at ,沒有在這個文件中的使用者則不能使用 at (即使沒有寫在 at.deny 當(dāng)中);
  • 如果 /etc/at.allow 不存在,就尋找 /etc/at.deny 這個文件,若寫在這個 at.deny 的使用者則不能使用 at ,而沒有在這個 at.deny 文件中的使用者,就可以使用 at 命令了。
  • 如果兩個文件都不存在,那么只有 root 可以使用 at 這個命令。

透過這個說明,我們知道 /etc/at.allow 是管理較為嚴(yán)格的方式,而 /etc/at.deny 則較為松散 (因為帳號沒有在該文件中,就能夠運行 at 了)。在一般的 distributions 當(dāng)中,由于假設(shè)系統(tǒng)上的所有用戶都是可信任的,因此系統(tǒng)通常會保留一個空的 /etc/at.deny 文件,意思是允許所有人使用 at 命令的意思 (您可以自行檢查一下該文件)。不過,萬一你不希望有某些使用者使用 at 的話,將那個使用者的帳號寫入 /etc/at.deny 即可! 一個帳號寫一行。

batch:為資源控制而延遲

at 一樣也是定期執(zhí)行的命令,使用方法也跟 at 相同,但是不同的是 batch 不需要指定時間,因為它會自動在系統(tǒng)負載比較低的時候執(zhí)行(平均負載小于 0.8 的時候)

crontab:在指定時間再執(zhí)行

上面詳細說了 at 命令的用法,循環(huán)運行的例行性計劃任務(wù),linux 系統(tǒng)則是由 cron(crond) 這個系統(tǒng)服務(wù)來控制的.linux 系統(tǒng)上面原本就有非常多的計劃性工作,因此這個系統(tǒng)服務(wù)是默認啟動的。另外,由于使用者自己也可以設(shè)置計劃任務(wù),所以,linux 系統(tǒng)也提供了使用者控制計劃任務(wù)的命令:crontab 命令。

crond 簡介

crond 四 linux 下用來周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個守護進程,與 windows 下的計劃任務(wù)類似,當(dāng)安裝完成操作系統(tǒng)后,默認會安裝此項服務(wù),并且會自啟動 crond 進程,crond 進程每分鐘會定期檢查是否又要執(zhí)行的任務(wù),如果有要執(zhí)行的文物,則會自動執(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 目錄下有一個 crontab 文件,這個就是系統(tǒng)任務(wù)調(diào)度的配置文件。下面我們來看一下 /etc/crontab 這個文件:

\# 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

前四行是用來配置 crond 任務(wù)運行的環(huán)境變量,第一行 shell 變量指定了系統(tǒng)要使用那個 shell,這里是 ba 是,第二行 PATH 變量指定了系統(tǒng)執(zhí)行命令的路徑,第三行 MAILTO 變量指定了 crond 的任務(wù)執(zhí)行信息將通過電子郵件發(fā)送給 root 用戶,如果 MAILTO 變量的值為空,則表示不發(fā)送任務(wù)執(zhí)行信息給用戶,第四行的 HOME 變量指定了在執(zhí)行命令或腳本時使用的主目錄。

用戶任務(wù)調(diào)度:用戶定期要執(zhí)行的工作,比如用戶數(shù)據(jù)備份,定是郵件提醒等。用戶可以使用 crontab 工具來定制自己的計劃任務(wù),所有用戶定義的 crontab 文件都被保存在 /var/spool/cron 目錄中。其文件名和用戶名一致。

使用者權(quán)限文件:

文件:
/etc/cron.deny // 該文件中國所列出的用戶不能使用 crontab 命令

文件:
/etc/cron/allow // 該文件中所列出用戶允許使用 crontab 命令

文件:
/etc/spool/cron // 所有用戶 crontab 文件存放的目錄,以用戶名命名

crontab 文件的含義

用戶所建立的 crontab 文件中,每一行都代表一項任務(wù),每行的每個字段代表一項設(shè)置,他的格式分為六個字段,前五個字段是時間設(shè)定段,第六個字段是要執(zhí)行的命令字段,格式如下:

minute hour day month week command

其中:

  • minute:表示分鐘,可以是從 0 到 59 之間的任何整數(shù)。
  • hour:表示小時,可以是從 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="" />

在以上各個字段中,還可以使用以下特殊字段:

  • 星號 (*):代表所有可能的值,例如 mouth 字段如果是星號,則表示在滿足其他字段的制約條件后每月都執(zhí)行該命令操作。
  • 逗號 (,):可以用逗號隔開的值制定一個列表范圍,例如“1,2,3,4,,6,9”
  • 中杠 (-):可以用證書之間的中杠表示一個整數(shù)范圍,例如“2-6”,表示”2,3,4,5,6”
  • 正斜杠 (/):可以用正斜杠指定時間的間隔頻率,例如“0-23/2” 表示每兩小數(shù)執(zhí)行一次。同時正斜杠可以和星號一起使用,例如 */10,如果用在 minute 字段,表示沒十分鐘執(zhí)行一次。

crond 服務(wù)

安裝 crontab:
\#yum install crontabs

服務(wù)操作說明:
\#/sbin/service crond start // 啟動服務(wù) \#/sbin/service crond stop // 關(guān)閉服務(wù) \#/sbin/service crond restart // 重啟服務(wù) \#/sbin/service crond reload // 重新載入配置

查看 crontab 服務(wù)狀態(tài):
\#service crond status

手動啟動 crontab 服務(wù):
\#service crond start

查看 crontab 服務(wù)是否已設(shè)置為開機啟動,執(zhí)行命令:
\#ntsysv

加入開機自動啟動:
\#chkconfig –level 35 crond on

crontab 詳解

格式:
crontab [-u user] file crontab [-u user] [-e | -l |-r]

功能:
通過 crontab 命令,我們可以在固定的間隔時間執(zhí)行指定的系統(tǒng)指令或 shell 腳本。時間間隔的單位可以是分鐘,小時,日,月。周以及以上的任意組合。這個命令社嘗試和周期性的日志分析或數(shù)據(jù)備份等工作。

參數(shù):
```選項名 說明 -u user 用來設(shè)定某個用戶的 crontab 服務(wù),例如”-u syx” 表示設(shè)定 syx 用戶的 crontab 服務(wù),這個參數(shù)一般有 root 用戶來運行 file file 是命令文件的名字,表示將 file 作為 crontab 的任務(wù)列表問價并載入 crontab。如果在命令行中沒有指定這個文件,crontab 命令將接受標(biāo)準(zhǔn)輸入 (鍵盤) 上鍵入的命令,并將它們載入 crontab -e 編輯某個用戶的 crontab 文件內(nèi)容。如果不指定用戶,則表示編輯當(dāng)前用戶的 crontab 文件。 -l 顯示某個用戶的 crontab 文件內(nèi)容,如果不指定用戶,則表示顯示當(dāng)前用戶的 crontab 文件內(nèi)容 -r 從 /var/spool/cron 目錄中刪除某個用戶的 crontab 文件,如果不指定,你猜結(jié)果怎樣? -i 在刪除用戶的 crontan 文件時給確認提示。


**常用方法**

1. **創(chuàng)建一個新的 crontab 文件**  
在考慮向 `cron` 進程提交一個 `crontab` 文件時,首先要做的一件事情就是設(shè)置環(huán)境變量 `EDITOR`。`cron` 進程根據(jù)它來確定使用哪個編輯器編輯 `crontab` 文件。99% 的 linux 用戶都是用 `vi`,如果你也是這樣那么你就編輯 $HOME 目錄下`.profile` 文件 (如果沒有,就是`.bash_profile` 文件),在其中加入這樣一行:`EDITOR=vi;export EDITOR` 然后保存退出。不妨創(chuàng)建一個名為 `<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```
    保存并退出。確保前面五個域用空格分隔。

    在上面的例子中,系統(tǒng)每個 15 分鐘向控制臺輸出依次當(dāng)前時間。如果系統(tǒng)崩潰或掛起,從最后所顯示的時間就可以一眼看出系統(tǒng)是什么時間停止工作的。在有些系統(tǒng)中,用 tty1 來表示控制臺??梢愿鶕?jù)實際情況對上面的粒子進行相應(yīng)的修改。為了提交你剛剛創(chuàng)建的 crontab 文件,可以把這個新創(chuàng)建的文件作為 cron 命令參數(shù)。
    `\#crontab syxcron`
    現(xiàn)在該文件已經(jīng)提交給 cron 進程,它每隔十五分鐘運行一次。
    同時,新創(chuàng)建的文件的一個副本已經(jīng)被放在 /var/spool/cron 目錄中,文件名就是用戶名 (即 syx)
    注意:這里容易出現(xiàn) “bad minute” 及 “errors in crontab file,can't install” 錯誤。經(jīng)確認,根本原因是 crontab 文件中時間格式定義不正確導(dǎo)致的。
    - crontab 時間格式內(nèi)容 
```*    *    *    *    *    command
M    H    D    m    d    command
分   時   日   月   周   命令
第 1 列表示分鐘 1~59 每分鐘用 * 或者 */1 表示
第 2 列表示小時 1~23(0 表示 0 點)
第 3 列表示日期 1~31
第 4 列表示月份 1~12
第 5 列標(biāo)識號星期 0~6(0 表示星期天)
第 6 列要運行的命令或腳本內(nèi)容

如果能掌握這個 crontab 的時間格式的定義,基本上就會避免出現(xiàn) “bad minute” 錯誤。

  1. 列出 crontab 文件
    為了列出 crontab 文件,可以用:
    \#crontab -l // 你覺得這里要是數(shù)字 1 有意義嗎? 如果你跟著我做了這個案例,你就會看到和上面的內(nèi)容一樣:0,15,30,45 * * * * /bin/echo 'date' > /dev/console
    使用這種方法可以在 $HOME 目錄中對 crontab 文件做一份備份:
    \#crontab -l >$HOME/mycron

  2. 編輯 crontab 文件
    如果希望添加,刪除或修改 crontab 文件中的條目,而 EDITOR 環(huán)境變量有舍值為 vi,可以使用 vi 來編輯 crontab 文件,命令:
    \#crontab -e
    可以像使用 vi 編輯其他任何文件那樣修改 crontab 文件并退出。如果修改了某些條目或添加了新的條目,那么在保存該文件時,cron 會對其進行必要的完整性檢查。如果其中的某個域出現(xiàn)超出 = 允許范圍的值,他就會提示你,我們在編輯 crontab 文件時,沒準(zhǔn)會加入新的條目。例如,加入下面一條: \# 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 文件的每一個條目之上加入一條注釋,這樣就可以知道它的功能、運行時間,更為重要的是,知道這是哪位用戶的作業(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 {} \;

  3. 刪除 crontab 文件
    要刪除 crontab 文件,可以用:\#crontab -r

  4. 恢復(fù)丟失的 crontab 文件
    如果不小心誤刪了 crontab 文件,假設(shè)你在自己的 $HOME 目錄下還有一個備份,那么可以將其拷貝到 /var/spool/cron/<username>,其中 <username> 是用戶名。如果由于權(quán)限問題無法完成拷貝,可以用:$crontab <filename>
    其中, 是你在 $ HOME 目錄中副本的文件名。

    我建議你在自己的 $HOME 目錄中保存一個該文件的副本。我就有過類似的經(jīng)歷,有數(shù)次誤刪了 crontab 文件(因為 r 鍵緊挨在 e 鍵的右邊)。這就是為什么有些系統(tǒng)文檔建議不要直接編輯 crontab 文件,而是編輯該文件的一個副本,然后重新提交新的文件。

    有些 crontab 的變體有些怪異,所以在使用 crontab 命令時要格外小心。如果遺漏了任何選項,crontab 可能會打開一個空文件,或者看起來像是個空文件。這時敲 delete 鍵退出,不要按 ,否則你將丟失 crontab 文件。

實例 1:每 1 分鐘執(zhí)行一次 command
命令:
* * * * * command

實例 2:每小時的第 3 和第 15 分鐘執(zhí)行
命令:
3,15 * * * * command

實例 3:在上午 8 點到 11 點的第 3 和第 15 分鐘執(zhí)行
命令:
3,15 8-11 * * * command

實例 4:每隔兩天的上午 8 點到 11 點的第 3 和第 15 分鐘執(zhí)行
命令:
3,15 8-11 */2 * * command

實例 5:每個星期一的上午 8 點到 11 點的第 3 和第 15 分鐘執(zhí)行
命令:
3,15 8-11 * * 1 command

實例 6:每晚的 21:30 重啟 smb
命令:
30 21 * * * /etc/init.d/smb restart

實例 7:每月 1、10、22 日的 4 :45 重啟 smb
命令:
45 4 1,10,22 * * /etc/init.d/smb restart

實例 8:每周六、周日的 1 :10 重啟 smb
命令:
10 1 * * 6,0 /etc/init.d/smb restart

實例 9:每天 18 :00 至 23 :00 之間每隔 30 分鐘重啟 smb
命令:
0,30 18-23 * * * /etc/init.d/smb restart

實例 10:每星期六的晚上 11 :00 pm 重啟 smb
命令:
0 23 * * 6 /etc/init.d/smb restart

實例 11:每一小時重啟 smb
命令:
* */1 * * * /etc/init.d/smb restart

實例 12:晚上 11 點到早上 7 點之間,每隔一小時重啟 smb
命令:
* 23-7/1 * * * /etc/init.d/smb restart

實例 13:每月的 4 號與每周一到周三的 11 點重啟 smb
命令:
0 11 4 * mon-wed /etc/init.d/smb restart

實例 14:一月一號的 4 點重啟 smb
命令:
0 4 1 jan * /etc/init.d/smb restart

實例 15:每小時執(zhí)行 /etc/cron.hourly 目錄內(nèi)的腳本
命令:
01 * * * * root run-parts /etc/cron.hourly

說明: run-parts 這個參數(shù)了,如果去掉這個參數(shù)的話,后面就可以寫要運行的某個腳本名,而不是目錄名了

使用注意事項

  1. 注意環(huán)境變量問題
    有時我們創(chuàng)建了一個 crontab,但是這個任務(wù)卻無法自動執(zhí)行,而手動執(zhí)行這個任務(wù)卻沒有問題,這種情況一般是由于在 crontab 文件中沒有配置環(huán)境變量引起的。 在 crontab 文件中定義多個調(diào)度任務(wù)時,需要特別注意的一個問題就是環(huán)境變量的設(shè)置,因為我們手動執(zhí)行某個任務(wù)時,是在當(dāng)前 shell 環(huán)境下進行的,程序當(dāng)然能找到環(huán)境變量,而系統(tǒng)自動執(zhí)行任務(wù)調(diào)度時,是不會加載任何環(huán)境變量的,因此,就需要在 crontab 文件中指定任務(wù)運行所需的所有環(huán)境變量,這樣,系統(tǒng)執(zhí)行任務(wù)調(diào)度時就沒有問題了。

    不要假定 cron 知道所需要的特殊環(huán)境,它其實并不知道。所以你要保證在 shelll 腳本中提供所有必要的路徑和環(huán)境變量,除了一些自動設(shè)置的全局變量。所以注意如下 3 點:

    • 腳本中涉及文件路徑時寫全局路徑;
    • 腳本執(zhí)行要用到 java 或其他環(huá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 &
    • 當(dāng)手動執(zhí)行腳本 OK,但是 crontab 死活不執(zhí)行時。這時必須大膽懷疑是環(huán)境變量惹的禍,并可以嘗試在 crontab 中直接引入環(huán)境變量解決問題。如: 0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
  2. 注意清理系統(tǒng)用戶的郵件日志
    每條任務(wù)調(diào)度執(zhí)行完畢,系統(tǒng)都會將任務(wù)輸出信息通過電子郵件的形式發(fā)送給當(dāng)前系統(tǒng)用戶,這樣日積月累,日志信息會非常大,可能會影響系統(tǒng)的正常運行,因此,將每條任務(wù)進行重定向處理非常重要。 例如,可以在 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)錯誤重定向到標(biāo)準(zhǔn)輸出,由于標(biāo)準(zhǔn)輸出已經(jīng)重定向到了 /dev/null,因此標(biāo)準(zhǔn)錯誤也會重定向到 /dev/null,這樣日志輸出問題就解決了。

  3. 系統(tǒng)級任務(wù)調(diào)度與用戶級任務(wù)調(diào)度
    系統(tǒng)級任務(wù)調(diào)度主要完成系統(tǒng)的一些維護操作,用戶級任務(wù)調(diào)度主要完成用戶自定義的一些任務(wù),可以將用戶級任務(wù)調(diào)度放到系統(tǒng)級任務(wù)調(diào)度來完成(不建議這么做),但是反過來卻不行,root 用戶的任務(wù)調(diào)度操作可以通過 “crontab –uroot –e” 來設(shè)置,也可以將調(diào)度任務(wù)直接寫入 /etc/crontab 文件,需要注意的是,如果要定義一個定時重啟系統(tǒng)的任務(wù),就必須將任務(wù)放到 /etc/crontab 文件,即使在 root 用戶下創(chuàng)建一個定時重啟系統(tǒng)的任務(wù)也是無效的。

  4. 其他注意事項
    新創(chuàng)建的 cron job,不會馬上執(zhí)行,至少要過 2 分鐘才執(zhí)行。如果重啟 cron 則馬上執(zhí)行。 當(dāng) crontab 突然失效時,可以嘗試 /etc/init.d/crond restart 解決問題?;蛘卟榭慈罩究茨硞€ job 有沒有執(zhí)行 / 報錯 tail -f /var/log/cron。

    千萬別亂運行 crontab -r。它從 Crontab 目錄(/var/spool/cron)中刪除用戶的 Crontab 文件。刪除了該用戶的所有 crontab 都沒了。

    在 crontab 中 % 是有特殊含義的,表示換行的意思。如果要用的話必須進行轉(zhuǎn)義 \%,如經(jīng)常用的 date ‘+%Y%m%d’在 crontab 里是不會執(zhí)行的,應(yīng)該換成 date '+\%Y\%m\%d'。

簡單的案例:http://www.ahlinux.com/start/cmd/20378.html