Linux 基礎學習篇 - Fedora Core 4

第十六章、例行性命令的建立 - for Fedora Core 4

包括了 crontab 與 at 這兩支程式啦!

最近更新時間: 2005/09/07

本文資料主要針對 Fedora Core 4 的系統進行說明, Fedora Core 1 主要是由 Red Hat Linux 9 改版而來, 這個 Red Hat Linux 9 並不是當前大家聽到的 RHEL 喔!那是在 RHEL 出現之前的產品,基本上是在 2003 年以前的作品了!Fedora Core 4 則是在 2005 年 6 月份釋出,使用的核心是 2.6.11 版,當時是很紅的一個作品!只是生命週期太短,所以用這個 Fedora 系列來介紹 Server, 當時的決定確實有點莫名其妙了...

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 Fedora Core 4 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!

不論什麼時候,建立系統可以自動的執行功能都是必須的!您瞭解目前系統在預設的情況中, 每天、每小時、每個月都在做些什麼事嗎?!您瞭解『循環的工作』與『僅進行一次的工作』有什麼不同嗎? 還有還有,如果你想要每年的老婆的生日前一天就發出一封信件提醒自己不要忘記; 又,如果是與初次見面的朋友的約會,又該如何設定啊?看看這一章先!

什麼是例行性命令?

每個人或多或少都有一些約會或者是工作,有的工作是例行性的,例如每年一次的加薪、 每個月一次的工作報告、每週一次的午餐會報、每天需要的打卡等等; 有的工作則是臨時發生的,例如剛好總公司有高官來訪,需要你準備演講器材等等! 用在生活上面,例如每年的愛人的生日、每天的起床時間等等、還有突發性的電腦大降價 (阿~鳥哥等好久了~~) 等等囉。

上面這些工作都可以稱為例行性命令,而這些工作 Linux 也都可以幫您提醒,例如:每一天早上 8:00 鐘要伺服器連接上音響,並啟動音樂來喚你起床;而中午 12:00 希望 Linux 可以發一封信到你的郵件信箱,提醒你可以去吃午餐了; 另外,在每年的你愛人的生日的前一天,先發封信提醒你,以免忘記這麼重要的一天。

Linux 工作排程的種類: at, cron

從上面的說明當中可以很清楚的發現兩種工作排程的方式:
  • 一種是例行性的,就是每隔一定的週期要來辦的事項;
  • 一種是突發性的,就是這次做完以後就沒有的那一種(電腦大降價....)
那麼在 Linux 底下如何達到這兩個功能呢?呵呵!那就得使用 at 與 crontab 這兩個好東西囉!
  • at : 這個工作僅執行一次就從 Linux 系統中的排程中取消;
  • cron : 這個工作將持續例行性的作下去!
底下我們先來談一談 Linux 的系統到底在做什麼事情,怎麼有若干多的工作排程在工作呢?然後再回來談一談 at 與 crontab 這兩個好東西!

系統上常見的例行性命令有哪些?

好了,那麼伺服器自己有什麼例行性命令要來作呀!?Linux 的工作可多著呢! 由前面提到的幾篇文章中,我們知道 Linux 本身在背景下的工作可是很多的, 尤其是開放網路連線的情況下,建立與取消連線、MySQL 資料庫的即時更新、以及一些例行的系統指令,例如釋放記憶體的工作等等。 由於例行的工作非常的多,實在不可能每天都要管理員來手動輸入吧! 所以才會建立這個工作排程的需求的!基本預設的工作有底下這些:
  • 進行登錄檔的資料輪替 ( log rotate )
    這個步驟重要了!尤其是在 log file 的選項當中!由於登錄檔案會越來越大, 所以需要適時適量的將登錄檔備份,並以新開的檔案來進行記錄,這樣效率會比較好,因此就需要使用 log rotate 啦!系統預設的重要工作之一;

  • rpm 資料庫的建立
    雖然 RPM 資料庫會在你以 RPM 安裝之後即更新到 RPM 資料庫當中去,但是難保會有漏網之魚,所以系統也會設定每隔依段時間自動的蒐集系統上面的 RPM 資料庫來建置一番;

  • 建立 locate 的資料庫
    是否還記得為何使用 locate 這個指令時,搜尋速度超快!那是因為 Linux 系統上將檔案與路徑都記錄在資料庫裡面了!所以使用 locate 的時候,嘿嘿!直接指向資料庫去 ( /var/lib/slocate/slocate.db ) ,偏偏麻煩的是這個檔案的更新是每天一次!所以當你今天更新的檔案,使用 locate 反而可能會找不到....

  • 進行程序的分析
    每隔依段時間會進行程序的分析,如果發現有僵屍程序的時候,就會將他刪去! 以保持記憶體的工作能力!

  • 登錄檔視察
    這個東西是在 Red Hat 7.1 以後才出現的東西,後來太好用了,所以被拿到舊版的 Red Hat 裡面去使用!基本上就是分析登錄檔啦!然後據以解析有問題的紀錄檔, 以維護主機的安全性!這部份不才小弟也自己寫了一個簡易型的分析檔案,覺得更好用就是了!

  • 指紋資料庫的比對
    基本上就是 tripwire 這個套件啦!可以用來分析最近被更動過的檔案內容! 蠻不錯的一個程式!有空也來玩玩看。
Linux 預設的例行工作至少就有這些了,再加上您努力的為 Linux 進行工作排程的設計, 嘿嘿!每天的工作量可是相當的大的呢!

僅進行一次的工作排程: at

好了,如同上面提到的,工作排程有所謂的例行性的,也有單一執行一次的,我們先來談一談僅執行一次的工作。 要使用這種工作排程時,我們的 Linux 系統上面必須要有負責這個排程的服務,那就是 atd 這個玩意兒。 可惜的是,目前挺多新的 Linux distributions 似乎預設不把他打開了,所以呢,我們必須要先手動將他啟用才行。 啟用的方法很簡單,就是這樣:
[root@linux ~]# /etc/init.d/atd restart
Stopping atd:                          [FAILED]
Starting atd:                          [  OK  ]

# 再設定一下開機時就啟動!
[root@linux ~]# chkconfig --level 35 atd on
看到那個『 OK 』的字樣就好囉~關於服務的啟動,我們會在後續再加以介紹,如果您真的有興趣, 那麼可以自行到 /etc/init.d/atd 這個 shell script 內去瞧一瞧先! ^_^。 至於那個 chkconfig ,呵呵!您也可以使用 man 先查閱一下啊!我們未來再介紹啦!


  • at 的工作
  • 既然是工作排程,那麼自然要有寫入工作的紀錄檔囉!沒錯啦! 我們可以使用 at 這個指令來幫忙寫入工作紀錄檔,工作紀錄檔預設的放置目錄在 /var/spool/at 底下,在寫入 at 記錄檔後,該工作便進入排程當中並等待執行。 當然啦,要讓 /var/spool/at 目錄底下的工作被實際運作,必須要啟動我們上面提到的 atd 那個服務啦!

    不過,並不是所有的人都可以進行 at 工作排程喔!為什麼?因為安全的理由啊~ 很多主機被所謂的綁架後,最常發現的就是他們的系統當中有很多的怪客程式 (cracker program) 被寫入例行性命令的排程當中了,所以,那些可惡的程式就可能定時或不定時的在你的系統當中工作, 呵呵!所以囉,除非是您認可的帳號,否則先不要讓他們使用 at 吧! 此外,我們可以利用 /etc/at.allow 與 /etc/at.deny 這兩個檔案來進行 at 的使用限制呢! 加上這兩個檔案後, at 的工作情況其實是這樣的:
    1. 先找尋 /etc/at.allow 這個檔案,寫在這個檔案中的使用者才能使用 at ,沒有在這個檔案中的使用者則不能使用 at ( 即使沒有寫在 at.deny 當中 );
    2. 如果沒有 /etc/at.allow 就尋找 /etc/at.deny 這個檔案,若寫在這個 at.deny 的使用者則不能使用 at ,而沒有在這個 at.deny 檔案中的使用者,就可以使用 at 咯;
    3. 如果兩個檔案都不存在,那麼只有 root 可以使用 at 這個指令。
    上面的情況說明了,其實我們只要有 at.deny 這個檔案存在就好了,因為我們假設系統內的帳號都是懂得操作的使用者, 因此,預設讓他們可以任意使用 at 這個好用的東西!這也是系統的預設值。我們的 FC4 預設也是只有 /etc/at.deny 存在,而且該檔案內並未有任何帳號資料!這表示任何人均可使用 at 啦!不過,萬一你不希望有某些使用者使用 at 的話,將那個使用者的帳號寫入 /etc/at.deny 即可! 一個帳號寫一行。


  • 開始使用 at 囉:
  • 好了,讓我們來談一談 at 這個玩意兒的語法吧!
    [root@linux ~]# at [-m] TIME
    參數:
    -m  :當 at 的工作完成後,以 email 的方式通知使用者該工作已完成。
    TIME:時間格式,這裡可以定義出『什麼時候要進行 at 這項工作』的時間,格式有:
      HH:MM				ex> 04:00
    	在今日的 HH:MM 時刻進行,若該時刻已超過,則明天的 HH:MM 進行此工作。
      HH:MM YYYY-MM-DD		ex> 04:00 2005-12-03
    	強制規定在某年某月的某一天的特殊時刻進行該工作!
      HH:MM[am|pm] [Month] [Date]	ex> 04pm December 3
    	也是一樣,強制在某年某月某日的某時刻進行!
      HH:MM[am|pm] + number [minutes|hours|days|weeks]
    	ex> now + 5 minutes	ex> 04pm + 3 days
    	就是說,在某個時間點『再加幾個時間後』才進行。
    範例:
    
    範例一:再過五分鐘後,將 /root/.bashrc 寄給 dmtsai 這個使用者
    [root@linux ~]# at now + 5 minutes
    at> /bin/mail dmtsai -s "testing at job" < /root/.bashrc
    at> <EOT>   <==這裡輸入 [ctrl] + d 就會出現 <EOF> 的字樣!代表結束!
    job 8 at 2005-09-07 10:47
    # 上面這行資訊在說明,第 8 個 at 工作將在 2005/09/07 的 10:47 進行!
    
    範例二:由於機房預計於 2005/09/16 停電,我想要在 2005/09/15 23:00 關機?
    [root@linux ~]# at 23:00 2005-09-15
    at> /bin/sync
    at> /bin/sync
    at> /sbin/shutdown -h now
    at> <EOT>
    job 10 at 2005-09-15 23:00
    # 您瞧瞧! at 還可以在一個工作內輸入多個指令呢!不錯吧!
    
    事實上,當我們使用 at 時,at 會給使用者一個 bash shell 讓使用者下達工作指令, 此時,建議你最好使用絕對路徑來下達你的指令,比較不會有問題喔!那我們知道每個指令都可能會有 standard output/standard error 啊,這些可能會輸出到螢幕上面的資訊會跑去哪裡? 呵呵!這些本來應該在螢幕上面出現的資訊通通會以 email 的方式傳送到使用者的 mailbox 裡面去! 而預設如果沒有 stdout/stderr 時,就不會有任何訊息傳送給使用者了。但你可以使用 at -m 這個參數來強制 at 傳送一個執行完畢的 email 訊息給你自己喔! ^_^

    另外一個 at 的執行優點是什麼呢?那就是『背景執行』的功能了!什麼是背景執行啊?! 很難瞭解嗎?沒關係,鳥哥提我自己的幾個例子來給您聽聽,您就瞭了!
    • 由於很多時候,我們其實都是使用 network 連接到主機來進行工作的, 但是 Client 與 Server 之間的網路連線其實並不見得很穩定,尤其是當你的 Client 電腦很忙的時候。 此時,萬一我要進行一項長時間的工作時,那麼風險就很大!鳥哥當初剛剛玩 Unix 時, 由於鳥哥所在的辦公室太小了,無法有多個螢幕與鍵盤,因此,我都是利用我的 windows 98 再以網路連線軟體連到 Unix 主機內作業的。當時我跑一個程式要跑 3 天...... 而眾所皆知的, Windows 98 的長時間開機的穩定性確實..... 在某一次執行時,發生了.....剩下 3 個鐘頭就跑完卻『連線終止』的情況~嗚嗚嗚嗚~ 又得要跑三天....

    • 另一個常用的時刻則是例如上面的範例二,由於某個突發狀況導致你必須要進行某項工作時, 這個 at 就很好用啦!
    由於 at 工作排程的使用上,系統會將該項 at 工作獨立出你的 bash 環境中, 直接交給系統的 atd 程式來接管,因此,當你下達了 at 的工作之後,就可以立刻離線了, 剩下的工作就完全交給 Linux 管理即可!所以囉,如果有長時間的網路工作時,嘿嘿! 使用 at 可以讓你免除網路斷線後的困擾喔! ^_^

    那麼萬一我下達了 at 之後,才發現指令輸入錯誤,該如何是好?呵呵!就將他移除啊! 利用 atq 與 atrm 吧!
    [root@linux ~]# atq
    [root@linux ~]# atrm [jobnumber]
    
    範例一:查詢目前主機上面有多少的 at 工作排程?
    [root@linux ~]# atq
    10      2005-09-15 23:00 a root
    # 上面說的是:『在 2005/09/15 的 23:00 有一項工作,該項工作指令下達者為 
    # root』而且,該項工作的工作號碼 (jobnumber) 為 10 號喔!
    
    範例二:將上述的第 10 個工作移除!
    [root@linux ~]# atrm 10
    [root@linux ~]# atq
    # 沒有任何資訊,表示該工作被移除了!
    
    利用 atq 與 atrm 來控制這個 at 的工作吧! ^_^

    循環執行的例行性命令

    相對於 at 是僅執行一次的工作,循環執行的例行性命令則是由 cron (crond) 這個系統服務來控制的。 由於系統預設就有相當多的例行性工作,因此,這個系統服務是預設啟動的。另外, 由於使用者自己也可以進行例行性工作排程,所以囉, Linux 也提供使用者控制例行性命令的指令 (crontab)。 底下我們分別來聊一聊囉!

    使用者的設定: crontab

    使用者想要建立例行性命令時,使用的是 crontab 這個指令啦~不過,為了安全性的問題, 與 at 同樣的,我們可以限制使用 crontab 的使用者帳號喔!使用的限制資料有:
    • /etc/cron.allow
      將可以使用 crontab 的帳號寫入其中,若不在這個檔案內的使用者則不可使用 crontab;

    • /etc/cron.deny
      將不可以使用 crontab 的帳號寫入其中,若未記錄到這個檔案當中的使用者,就可以使用 crontab 。
    與 at 很像吧!同樣的,以優先順序來說, /etc/cron.allow 比 /etc/cron.deny 要優先, 而判斷上面,這兩個檔案只選擇一個來限制而已,因此,建議您只要保留一個即可, 免得影響自己在設定上面的判斷!一般來說,系統預設是保留 /etc/cron.deny , 您可以將不想讓他執行 crontab 的那個使用者寫入 /etc/cron.deny 當中,一個帳號一行!

    當使用者使用 crontab 這個指令來建立工作排程之後,該項工作就會被紀錄到 /var/spool/cron/ 裡面去了,而且是以帳號來作為判別的喔!舉例來說, dmtsai 使用 crontab 後, 他的工作會被紀錄到 /var/spool/cron/dmtsai 裡頭去!但請注意,不要使用 vi 直接編輯該檔案, 因為可能由於輸入語法錯誤,會導致無法執行 cron 喔!另外, cron 執行的每一項工作都會被紀錄到 /var/log/cron 這個登錄檔中,所以囉,如果您的 Linux 不知道有否被植入木馬時, 也可以搜尋一下 /var/log/cron 這個登錄檔呢!

    好了,那麼我們就來聊一聊 crontab 的語法吧!
    [root@linux ~]# crontab [-u username] [-l|-e|-r]
    參數:
    -u  :只有 root 才能進行這個任務,亦即幫其他使用者建立/移除 crontab;
    -e  :編輯 crontab 的工作內容
    -l  :查閱 crontab 的工作內容
    -r  :移除 crontab 的工作內容
    範例:
    
    範例一:用 dmtsai 在每天的 12:00 發信給自己
    [dmtsai@linux ~]$ crontab -e
    # 此時會進入 vi 的編輯畫面讓您編輯工作!注意到,每項工作都是一行。
    0   12  *  *  * mail dmtsai -s "at 12:00" < /home/dmtsai/.bashrc
    #分 時 日 月 週 |<==============指令串========================>|
    
    任何使用者只要不被列入 /etc/cron.deny 當中,那麼他就可以直接下達『 crontab -e 』去編輯自己的例行性命令了!整個過程就如同上面提到的,會進入 vi 的編輯畫面, 然後以一個工作一行來編輯,編輯完畢之後,輸入『 :wq 』儲存後離開 vi 就可以了! 而每項工作的格式都是『 五個時間參數 實際動作指令 』,那麼那五個時間參數代表什麼呢?

    代表意義分鐘小時日期月份
    數字範圍0-590-231-311-120-7

    比較有趣的是那個『週』喔!當週為 0 或 7 時,都代表『星期天』的意思!另外, 還有一些輔助的字符,大概有底下這些:

    特殊字符代表意義
    *代表任何時刻都接受的意思!舉例來說,上表的範例一,那個日、月、週都是 * , 就代表著『不論何月、何日的禮拜幾的 12:00 都執行後續指令』的意思!
    ,代表分隔時段的意思。舉例來說,如果要下達的工作是 3:00 與 6:00 時,就會是:
      0 3,6 * * * command
    還是有五欄,不過第二欄是 3,6 ,代表 3 與 6 都適用!
    -代表一段時間範圍內,舉例來說, 8 點到 12 點之間的每小時的 20 分都進行一項工作:
      20 8-12 * * * command
    仔細看到第二欄變成 8-12 喔!代表 8,9,10,11,12 都適用的意思!
    /n那個 n 代表數字,亦即是『每隔 n 單位間隔』的意思,例如每五分鐘進行一次,則:
      */5 * * * * command
    很簡單吧!用 * 與 /5 來搭配,也可以寫成 0-59/5 ,相同意思!

    我們就來搭配幾個例子練習看看吧!

    例題:假若你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日的 23:59 發一封信給他,這封信的內容已經寫在 /home/dmtsai/lover.txt 內了,該如何進行?
    答:
      直接下達 crontab -e 之後,編輯成為:
        59 23 1 5 * mail kiki < /home/dmtsai/lover.txt
      那樣的話,每年 kiki 都會收到你的這封信喔!(當然囉,信的內容就要每年變一變啦!)

    例題:假如每五分鐘需要執行 /home/dmtsai/test.sh 一次,又該如何?
    答:
      同樣使用 crontab -e 進入編輯:
        */5 * * * * /home/dmtsai/test.sh

    那個 crontab 每個人都只有一個檔案存在,就是在 /var/spool/cron 裡面啊! 還有建議您:『指令下達時,最好使用絕對路徑,這樣比較不會找不到執行檔喔!』
    例題:假如你每星期六都與朋友有約,那麼想要每個星期五下午 4:30 告訴你朋友星期六的約會不要忘記,則:
    答:
      還是使用 crontab -e 啊!
        30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt

    真的是很簡單吧!呵呵!那麼,該如何查詢使用者目前的 crontab 內容呢? 我們可以這樣來看看:
    [dmtsai@linux ~]$ crontab -l
    59 23 1 5 * mail kiki < /home/dmtsai/lover.txt
    */5 * * * * /home/dmtsai/test.sh
    30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt
    
    # 注意,若僅想要移除一項工作而已的話,必須要用 crontab -e 去編輯~
    # 如果想要全部的工作都移除,才使用 crontab -r 喔!
    [dmtsai@linux ~]$ crontab -r
    [dmtsai@linux ~]$ crontab -l
    no crontab for dmtsai
    
    看到了嗎? crontab 『整個內容都不見了!』所以請注意:『如果只是要刪除某個 crontab 的工作項目,那麼請使用 crontab -e 來重新編輯即可!』如果使用 -r 的參數,是會將所有的 crontab 資料內容都刪掉的!千萬注意了!

    系統的設定: /etc/crontab

    這個『 crontab -e 』是針對使用者的 cron 來設計的,如果是『系統的例行性任務』時, 該怎麼辦呢?是否還是需要以 crontab -e 來管理你的例行性命令呢?當然不需要,你只要編輯 /etc/crontab這個檔案就可以啦!有一點需要特別注意喔!那就是 crontab -e 這個 crontab 其實是 /usr/bin/crontab 這個執行檔,但是 /etc/crontab 可是一個『純文字檔』喔!你可以 root 的身份編輯一下這個檔案哩!

    基本上, cron 這個服務的最低偵測限制是『分鐘』,所以『 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裡面的資料內容 』,因此,只要你編輯完 /etc/crontab 這個檔案,並且將他儲存之後,呵呵!那麼 cron 的設定就自動的會來執行了!
    Tips 鳥哥 在 Linux 底下的 crontab 會自動的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項,但是某些原因或者是其他的 Unix 系統中,由於 crontab 是讀到記憶體當中的,所以在你修改完 /etc/crontab 之後,可能並不會馬上執行, 這個時候請重新啟動 crond 這個服務吧!
      /etc/init.d/crond restart
    好了,我們就來看一下這個 /etc/crontab 的內容吧!
    [root@linux ~]# cat /etc/crontab
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/
    
    # run-parts
    01  *  *  *  *   root      run-parts /etc/cron.hourly   <==每小時
    02  4  *  *  *   root      run-parts /etc/cron.daily    <==每天
    22  4  *  *  0   root      run-parts /etc/cron.weekly   <==每週日
    42  4  1  *  *   root      run-parts /etc/cron.monthly  <==每個月 1 號
    分 時 日 月 週 執行者身份  指令串
    
    看到這個檔案的內容你大概就瞭解了吧!呵呵,沒錯!這個檔案與將剛剛我們下達 crontab -e 的內容幾乎完全一模一樣!只是有幾個地方不太相同:
    • MAILTO=root
      這個項目是說,當 /etc/crontab 這個檔案中的例行性命令發生錯誤時,或者是該執行結果有 STDOUT/STDERR 時, 會將錯誤訊息或者是螢幕顯示的訊息傳給誰?預設當然是由系統直接寄發一封 mail 給 root 啦!不過, 由於 root 並無法在用戶端中以 POP3 之類的軟體收信,因此,我通常都將這個 e-mail 改成自己的帳號,好讓我隨時瞭解系統的狀況!例如: MAILTO=dmtsai@my.host.name

    • PATH=....
      還記得我們在 BASH Shell 當中一直提到的執行檔路徑問題吧!沒錯啦!這裡就是輸入執行檔的搜尋路徑! 使用預設的路徑設定就已經很足夠了!

    • 01 * * * * root run-parts /etc/cron.hourly
      在註解符號『 #run-parts 』這一行以後的命令,我們可以發現,五個數字後面接的是 root 喔!沒錯,與 crontab -e 的內容是不太一樣的!這個欄位的 root 代表的是『 執行的使用者身份為 root 』當然囉,你 也可以將這一行改寫成其他的身份哩!而 run-parts 代表後面接的 /etc/cron.hourly 是『 一個目錄內(/etc/cron.hourly)的所有可執行檔 』,這也就是說,每個小時的 01 分,系統會以 root 的身份去 /etc/cron.hourly/ 這個目錄下執行所有可以執行的檔案!後面的三行也都是類似的意思!你可以到 /etc/ 底下去看看,系統本來就預設了這四個目錄了!你可以將每天需要執行的命令直接寫到 /etc/cron.daily/ 即可,還不需要使用到 crontab -e 的程式呢!方便吧!
    基本上, /etc/crontab 這個檔案裡面支援兩種下達指令的方式,一種是直接下達指令, 一種則是以目錄來規劃,例如:
    • 指令型態
      01 * * * * dmtsai mail -s "testing" kiki < /home/dmtsai/test.txt
      以 dmtsai 這個使用者的身份,在每小時執行一次 mail 指令。

    • 目錄規劃
      */5 * * * * root run-parts /root/runcron
      建立一個 /root/runcron 的目錄,將要每隔五分鐘執行的『可執行檔』都寫到該目錄下, 就可以讓系統每五分鐘執行一次該目錄下的所有可執行檔。
    這樣就可以曉得 run-parts 的用意了吧!此外,與 crontab -e 規劃當中最不相同的就是多了一個『使用者層級』的概念,通常我們都是以 root 的角度來規劃例行性命令,但是總有不需要 root 的指令吧!就可以使用這個層級來規範該程序的使用者屬於誰囉!

    好!你現在大概瞭解了這一個咚咚吧!OK!假設你現在要作一個目錄,讓系統可以每 2 分鐘去執行這個目錄下的所有可以執行的檔案,你可以寫下如下的這一行在 /etc/crontab 中:
      */2 * * * * root run-parts /etc/cron.min
    當然囉, /etc/cron.min 這個目錄是需要存在的喔!那如果我需要執行的是一個『程式』而已, 不需要用到一個目錄呢?該如何是好?例如在偵測網路流量時,我們希望每五分鐘偵測分析一次, 可以這樣寫:
      */5 * * * * root /bin/mrtg /etc/mrtg/mrtg.cfg
    沒有了 run-parts 就是代表『一個檔案』的意思啦!

    如何!?建立例行性命令很簡單吧!如果你是系統管理員的話,直接修改 /etc/crontab 這個檔案即可喔!又便利,又方便管理呢!

    一些使用特點:

    有的時候,我們以系統的 cron 來進行例行性工作的建立時,要注意一些使用方面的特性。 舉例來說,如果我們有四個工作都是五分鐘要進行一次的,那麼是否這四個動作全部都在同一個時間點進行? 如果同時進行,該四個動作又很耗系統資源,如此一來,每五分鐘不是會讓系統忙得要死? 呵呵!此時好好的分配一些執行時間,呵呵!就 OK 啦!所以,注意一下:

  • 資源分配不均的問題
  • 當大量使用 crontab 的時候,總是會有問題發生的,最嚴重的問題就是『系統資源分配不均』的問題, 以鳥哥的系統為例,我有偵測流量的資訊,包括:
    • 流量
    • 區域內其他 PC 的流量偵測
    • CPU 使用率
    • RAM 使用率
    • 線上人數即時偵測
    如果每個流程都在同一個時間啟動的話,呵呵!那麼在某個時段時,我的系統會變的相當的繁忙, 所以,這個時候就必須要分別設定啦!我可以這樣做:
    [root@linux ~]# vi /etc/crontab
    1,6,11,16,21,26,31,36,41,46,51,56 * * * * root  CMD1
    2,7,12,17,22,27,32,37,42,47,52,57 * * * * root  CMD2
    3,8,13,18,23,28,33,38,43,48,53,58 * * * * root  CMD3
    4,9,14,19,24,29,34,39,44,49,54,59 * * * * root  CMD4
    
    看到了沒?那個『 , 』分隔的時候,請注意,不要有空白字元!(連續的意思)如此一來, 則可以將每五分鐘工作的流程分別在不同的時刻來工作!則可以讓系統的執行較為順暢呦!

  • 取消不要的輸出項目
  • 另外一個困擾發生在『 當有執行成果或者是執行的項目中有輸出的資料時,該資料將會 mail 給 MAILTO 設定的帳號 』,好啦,那麼當有一個排程一直出錯(例如 DNS 的偵測系統當中,若 DNS 上層主機掛掉,那麼你就會一直收到錯誤訊息!)怎麼辦?呵呵!還記得 BASH 與 Shell scripts 那一章吧!?直接以『命令重導向』將輸出的結果輸出到 /dev/null 這個垃圾桶當中就好了!

  • 安全的檢驗
  • 很多時候被植入木馬都是以例行命令的方式植入的,所以可以藉由檢查 /var/log/cron 的內容來視察是否有『非您設定的 cron 被執行了?』這個時候就需要小心一點囉!

    本章習題練習

    ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
    • 今天假設我有一個指令程式,名稱為: ping.sh 這個檔名!我想要讓系統每三分鐘執行這個檔案一次, 但是偏偏這個檔案會有很多的訊息顯示出來,所以我的 root 帳號每天都會收到差不多四百多封的信件,光是收信就差不多快要瘋掉了! 那麼請問應該怎麼設定比較好呢?
    • 這個涉及命令重導向的問題,我們可以將他導入檔案或者直接丟棄!如果該訊息不重要的話, 那麼就予以丟棄,如果訊息很重要的話,才將他保留下來!假設今天這個命令不重要, 所以將他丟棄掉!因此,可以這樣寫:
        */3 * * * * root /usr/local/ping.sh > /dev/null 2>&1
    • 您預計要在 2006 年的 2 月 14 日寄出一封給 kiki ,只有該年才寄出!該如何下達指令?
    • at 1am 2006-02-14
    • 下達 crontab -e 之後,如果輸入這一行,代表什麼意思?
      * 15 * * 1-5 /usr/local/bin/tea_time.sh
    • 在每星期的 1~5 ,下午 3 點的每分鐘,共進行 60 次 /usr/local/bin/tea_time.sh 這個檔案。 要特別注意的是,每個星期 1~5 的 3 點都會進行 60 次ㄟ!很麻煩吧~是錯誤的寫法啦~ 應該是要寫成:
      30 15 * * 1-5 /usr/local/bin/tea_time.sh
    • 我用 vi 編輯 /etc/crontab 這個檔案,我編輯的那一行是這樣的:
      25 00 * * 0 /usr/local/bin/backup.sh
      這一行代表的意義是什麼?
    • 這一行代表......沒有任何意義!因為語法錯誤!您必須要瞭解,在 /etc/crontab 當中每一行都必須要有使用者才行!所以,應該要將原本那行改成:
      25 00 * * 0 root /usr/local/bin/backup.sh
    • 請問,您的系統每天、每週、每個月各有進行什麼工作?
    • 因為 FC4 系統預設的例行性命令都放置在 /etc/cron.* 裡面,所以,你可以自行去: /etc/cron.daily/, /etc/cron.week/, /etc/cron.monthly/ 這三個目錄內看一看, 就知道啦! ^_^
    • 每個星期六凌晨三點去系統搜尋一下內有 SUID/SGID 的任何檔案!並將結果輸出到 /tmp/uidgid.files
    • vi /etc/crontab
      0 3 * * 6 root find / -perm +6000 > /tmp/uidgid.files
    修改歷史:
    • 2002/05/30:第一次完成
    • 2003/02/10:重新編排與加入 FAQ
    • 2005/09/07:將舊的文章移動到 此處
    • 2005/09/07:呼呼!終於完成風格囉~同時加入一些習題練習。
    伺服器篇文件
    各版本彙整說明
    CentOS 6.x