不論什麼時候,建立系統可以自動的執行功能都是必須的!您瞭解目前系統在預設的情況中, 每天、每小時、每個月都在做些什麼事嗎?!您瞭解‘循環的工作’與‘僅進行一次的工作’有什麼不同嗎? 還有還有,如果你想要每年的老婆的生日前一天就發出一封信件提醒自己不要忘記; 又,如果是與初次見面的朋友的約會,又該如何設定啊?看看這一章先! |
1.1 Linux 工作排程的種類: at, cron
1.2 系統上常見的例行性命令有哪些?
2. 僅執行一次的工作排程: at, atq, atrm
3. 循環執行的例行性命令: cron
3.1 使用者的設定: crontab
3.2 系統的設定: /etc/crontab
4. 一些使用特點:
5. 本章習題練習:
上面這些工作都可以稱爲例行性命令,而這些工作 Linux 也都可以幫您提醒,例如:每一天早上 8:00 鍾要伺服器連接上音響,並啓動音樂來喚你起牀;而中午 12:00 希望 Linux 可以發一封信到你的郵件信箱,提醒你可以去吃午餐了; 另外,在每年的你愛人的生日的前一天,先發封信提醒你,以免忘記這麼重要的一天。
Linux 工作排程的種類: at, cron
- 一種是例行性的,就是每隔一定的週期要來辦的事項;
- 一種是突發性的,就是這次做完以後就沒有的那一種(電腦大降價....)
- at : 這個工作僅執行一次就從 Linux 系統中的排程中取消;
- cron : 這個工作將持續例行性的作下去!
系統上常見的例行性命令有哪些?
- 進行登錄檔的資料輪替 ( 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 這個套件啦!可以用來分析最近被更動過的檔案內容! 蠻不錯的一個程式!有空也來玩玩看。
僅進行一次的工作排程: at
[root@linux ~]# Stopping atd: [FAILED] Starting atd: [ OK ] [root@linux ~]# |
at 的工作
不過,並不是所有的人都可以進行 at 工作排程喔!爲什麼?因爲安全的理由啊~ 很多主機被所謂的綁架後,最常發現的就是他們的系統當中有很多的怪客程式 (cracker program) 被寫入例行性命令的排程當中了,所以,那些可惡的程式就可能定時或不定時的在你的系統當中工作, 呵呵!所以囉,除非是您認可的帳號,否則先不要讓他們使用 at 吧! 此外,我們可以利用 /etc/at.allow 與 /etc/at.deny 這兩個檔案來進行 at 的使用限制呢! 加上這兩個檔案後, at 的工作情況其實是這樣的: 先找尋 /etc/at.allow 這個檔案,寫在這個檔案中的使用者才能使用 at ,沒有在這個檔案中的使用者則不能使用 at ( 即使沒有寫在 at.deny 當中 ); 如果沒有 /etc/at.allow 就尋找 /etc/at.deny 這個檔案,若寫在這個 at.deny 的使用者則不能使用 at ,而沒有在這個 at.deny 檔案中的使用者,就可以使用 at 咯; 如果兩個檔案都不存在,那麼只有 root 可以使用 at 這個指令。 上面的情況說明了,其實我們只要有 at.deny 這個檔案存在就好了,因爲我們假設系統內的帳號都是懂得操作的使用者, 因此,預設讓他們可以任意使用 at 這個好用的東西!這也是系統的預設值。我們的 FC4 預設也是隻有 /etc/at.deny 存在,而且該檔案內並未有任何帳號資料!這表示任何人均可使用 at 啦!不過,萬一你不希望有某些使用者使用 at 的話,將那個使用者的帳號寫入 /etc/at.deny 即可! 一個帳號寫一行。
開始使用 at 囉:
[root@linux ~]# [root@linux ~]# at> at> <EOT> job 8 at 2005-09-07 10:47 [root@linux ~]# at> at> at> at> <EOT> job 10 at 2005-09-15 23:00 |
另外一個 at 的執行優點是什麼呢?那就是‘背景執行’的功能了!什麼是背景執行啊?! 很難了解嗎?沒關係,鳥哥提我自己的幾個例子來給您聽聽,您就了了!
- 由於很多時候,我們其實都是使用 network 連接到主機來進行工作的, 但是 Client 與 Server 之間的網路連線其實並不見得很穩定,尤其是當你的 Client 電腦很忙的時候。 此時,萬一我要進行一項長時間的工作時,那麼風險就很大!鳥哥當初剛剛玩 Unix 時, 由於鳥哥所在的辦公室太小了,無法有多個螢幕與鍵盤,因此,我都是利用我的 windows 98 再以網路連線軟體連到 Unix 主機內作業的。當時我跑一個程式要跑 3 天...... 而衆所皆知的, Windows 98 的長時間開機的穩定性確實..... 在某一次執行時,發生了.....剩下 3 個鐘頭就跑完卻‘連線終止’的情況~嗚嗚嗚嗚~ 又得要跑三天....
- 另一個常用的時刻則是例如上面的範例二,由於某個突發狀況導致你必須要進行某項工作時, 這個 at 就很好用啦!
那麼萬一我下達了 at 之後,才發現指令輸入錯誤,該如何是好?呵呵!就將他移除啊! 利用 atq 與 atrm 吧!
[root@linux ~]# [root@linux ~]# [root@linux ~]# 10 2005-09-15 23:00 a root [root@linux ~]# [root@linux ~]# |
循環執行的例行性命令
使用者的設定: crontab
- /etc/cron.allow:
將可以使用 crontab 的帳號寫入其中,若不在這個檔案內的使用者則不可使用 crontab; - /etc/cron.deny:
將不可以使用 crontab 的帳號寫入其中,若未記錄到這個檔案當中的使用者,就可以使用 crontab 。
當使用者使用 crontab 這個指令來建立工作排程之後,該項工作就會被紀錄到 /var/spool/cron/ 裏面去了,而且是以帳號來作爲判別的喔!舉例來說, dmtsai 使用 crontab 後, 他的工作會被紀錄到 /var/spool/cron/dmtsai 裏頭去!但請注意,不要使用 vi 直接編輯該檔案, 因爲可能由於輸入語法錯誤,會導致無法執行 cron 喔!另外, cron 執行的每一項工作都會被紀錄到 /var/log/cron 這個登錄檔中,所以囉,如果您的 Linux 不知道有否被植入木馬時, 也可以搜尋一下 /var/log/cron 這個登錄檔呢!
好了,那麼我們就來聊一聊 crontab 的語法吧!
[root@linux ~]# [dmtsai@linux ~]$ |
代表意義 | 分鐘 | 小時 | 日期 | 月份 | 周 |
數字範圍 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 |
比較有趣的是那個‘周’喔!當週爲 0 或 7 時,都代表‘星期天’的意思!另外, 還有一些輔助的字符,大概有底下這些:
特殊字符 | 代表意義 |
* | 代表任何時刻都接受的意思!舉例來說,上表的範例一,那個日、月、周都是 * , 就代表着‘不論何月、何日的禮拜幾的 12:00 都執行後續指令’的意思! |
, | 代表分隔時段的意思。舉例來說,如果要下達的工作是 3:00 與 6:00 時,就會是: 0 3,6 * * * command 還是有五欄,不過第二欄是 3,6 ,代表 3 與 6 都適用! |
- | 代表一段時間範圍內,舉例來說, 8 點到 12 點之間的每小時的 20 分都進行一項工作: 0 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 內了,該如何進行? 答:
|
例題:假如每五分鐘需要執行 /home/dmtsai/test.sh 一次,又該如何? 答:
|
那個 crontab 每個人都只有一個檔案存在,就是在 /var/spool/cron 裏面啊! 還有建議您:‘指令下達時,最好使用絕對路徑,這樣比較不會找不到執行檔喔!’
例題:假如你每星期六都與朋友有約,那麼想要每個星期五下午 4:30 告訴你朋友星期六的約會不要忘記,則: 答:
|
真的是很簡單吧!呵呵!那麼,該如何查詢使用者目前的 crontab 內容呢? 我們可以這樣來看看:
[dmtsai@linux ~]$ 59 23 1 5 * mail kiki < /home/dmtsai/lover.txt */5 * * * * /home/dmtsai/test.sh 30 16 * * 5 mail [email protected] < /home/dmtsai/friend.txt [dmtsai@linux ~]$ [dmtsai@linux ~]$ no crontab for dmtsai |
系統的設定: /etc/crontab
基本上, cron 這個服務的最低偵測限制是‘分鐘’,所以‘ cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裏面的資料內容 ’,因此,只要你編輯完 /etc/crontab 這個檔案,並且將他儲存之後,呵呵!那麼 cron 的設定就自動的會來執行了!
Tips: 在 Linux 底下的 crontab 會自動的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項,但是某些原因或者是其他的 Unix 系統中,由於 crontab 是讀到記憶體當中的,所以在你修改完 /etc/crontab 之後,可能並不會馬上執行, 這個時候請重新啓動 crond 這個服務吧!
|
[root@linux ~]#
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
|
- MAILTO=root:
這個項目是說,當 /etc/crontab 這個檔案中的例行性命令發生錯誤時,或者是該執行結果有 STDOUT/STDERR 時, 會將錯誤訊息或者是螢幕顯示的訊息傳給誰?預設當然是由系統直接寄發一封 mail 給 root 啦!不過, 由於 root 並無法在用戶端中以 POP3 之類的軟體收信,因此,我通常都將這個 e-mail 改成自己的帳號,好讓我隨時瞭解系統的狀況!例如: [email protected] - 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 的程式呢!方便吧!
- 指令型態
01 * * * * dmtsai mail -s "testing" kiki < /home/dmtsai/test.txt
以 dmtsai 這個使用者的身份,在每小時執行一次 mail 指令。 - 目錄規劃
*/5 * * * * root run-parts /root/runcron
建立一個 /root/runcron 的目錄,將要每隔五分鐘執行的‘可執行檔’都寫到該目錄下, 就可以讓系統每五分鐘執行一次該目錄下的所有可執行檔。
好!你現在大概瞭解了這一個咚咚吧!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 這個檔案即可喔!又便利,又方便管理呢!
一些使用特點:
資源分配不均的問題:
- 流量
- 區域內其他 PC 的流量偵測
- CPU 使用率
- RAM 使用率
- 線上人數即時偵測
[root@linux ~]#
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
|
本章習題練習
( 要看答案請將滑鼠移動到‘答:’底下的空白處,按下左鍵圈選空白處即可察看 )
- 今天假設我有一個指令程式,名稱爲: ping.sh 這個檔名!我想要讓系統每三分鐘執行這個檔案一次, 但是偏偏這個檔案會有很多的訊息顯示出來,所以我的 root 帳號每天都會收到差不多四百多封的信件,光是收信就差不多快要瘋掉了! 那麼請問應該怎麼設定比較好呢?
這個涉及命令重導向的問題,我們可以將他導入檔案或者直接丟棄!如果該訊息不重要的話, 那麼就予以丟棄,如果訊息很重要的話,纔將他保留下來!假設今天這個命令不重要, 所以將他丟棄掉!因此,可以這樣寫:
- */5 * * * * 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