最近更新日期:2005/09/07
1. 什麼是例行性命令
1.1 Linux 工作排程的種類: at, cron 1.2 系統上常見的例行性命令有哪些? 2. 僅執行一次的工作排程: at, atq, atrm 3. 循環執行的例行性命令: cron 3.1 使用者的設定: crontab 3.2 系統的設定: /etc/crontab 4. 一些使用特點: 5. 本章習題練習: 6. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23889 什麼是例行性命令?
每個人或多或少都有一些約會或者是工作,有的工作是例行性的,例如每年一次的加薪、
每個月一次的工作報告、每週一次的午餐會報、每天需要的打卡等等;
有的工作則是臨時發生的,例如剛好總公司有高官來訪,需要你準備演講器材等等!
用在生活上面,例如每年的愛人的生日、每天的起床時間等等、還有突發性的電腦大降價
(阿~鳥哥等好久了~~) 等等囉。
上面這些工作都可以稱為例行性命令,而這些工作 Linux 也都可以幫您提醒,例如:每一天早上 8:00 鐘要伺服器連接上音響,並啟動音樂來喚你起床;而中午 12:00 希望 Linux 可以發一封信到你的郵件信箱,提醒你可以去吃午餐了; 另外,在每年的你愛人的生日的前一天,先發封信提醒你,以免忘記這麼重要的一天。 Linux 工作排程的種類: at, cron
從上面的說明當中可以很清楚的發現兩種工作排程的方式:
系統上常見的例行性命令有哪些?
好了,那麼伺服器自己有什麼例行性命令要來作呀!?Linux 的工作可多著呢!
由前面提到的幾篇文章中,我們知道 Linux 本身在背景下的工作可是很多的,
尤其是開放網路連線的情況下,建立與取消連線、MySQL
資料庫的即時更新、以及一些例行的系統指令,例如釋放記憶體的工作等等。
由於例行的工作非常的多,實在不可能每天都要管理員來手動輸入吧!
所以才會建立這個工作排程的需求的!基本預設的工作有底下這些:
僅進行一次的工作排程: at
好了,如同上面提到的,工作排程有所謂的例行性的,也有單一執行一次的,我們先來談一談僅執行一次的工作。
要使用這種工作排程時,我們的 Linux 系統上面必須要有負責這個排程的服務,那就是 atd 這個玩意兒。
可惜的是,目前挺多新的 Linux distributions 似乎預設不把他打開了,所以呢,我們必須要先手動將他啟用才行。
啟用的方法很簡單,就是這樣:
既然是工作排程,那麼自然要有寫入工作的紀錄檔囉!沒錯啦!
我們可以使用 at 這個指令來幫忙寫入工作紀錄檔,工作紀錄檔預設的放置目錄在
/var/spool/at 底下,在寫入 at 記錄檔後,該工作便進入排程當中並等待執行。
當然啦,要讓 /var/spool/at 目錄底下的工作被實際運作,必須要啟動我們上面提到的 atd 那個服務啦!
不過,並不是所有的人都可以進行 at 工作排程喔!為什麼?因為安全的理由啊~ 很多主機被所謂的綁架後,最常發現的就是他們的系統當中有很多的怪客程式 (cracker program) 被寫入例行性命令的排程當中了,所以,那些可惡的程式就可能定時或不定時的在你的系統當中工作, 呵呵!所以囉,除非是您認可的帳號,否則先不要讓他們使用 at 吧! 此外,我們可以利用 /etc/at.allow 與 /etc/at.deny 這兩個檔案來進行 at 的使用限制呢! 加上這兩個檔案後, at 的工作情況其實是這樣的:
好了,讓我們來談一談 at 這個玩意兒的語法吧!
另外一個 at 的執行優點是什麼呢?那就是『背景執行』的功能了!什麼是背景執行啊?! 很難瞭解嗎?沒關係,鳥哥提我自己的幾個例子來給您聽聽,您就瞭了!
那麼萬一我下達了 at 之後,才發現指令輸入錯誤,該如何是好?呵呵!就將他移除啊! 利用 atq 與 atrm 吧!
循環執行的例行性命令
相對於 at 是僅執行一次的工作,循環執行的例行性命令則是由 cron (crond) 這個系統服務來控制的。
由於系統預設就有相當多的例行性工作,因此,這個系統服務是預設啟動的。另外,
由於使用者自己也可以進行例行性工作排程,所以囉, Linux 也提供使用者控制例行性命令的指令 (crontab)。
底下我們分別來聊一聊囉!
使用者的設定: crontab
使用者想要建立例行性命令時,使用的是 crontab 這個指令啦~不過,為了安全性的問題,
與 at 同樣的,我們可以限制使用 crontab 的使用者帳號喔!使用的限制資料有:
當使用者使用 crontab 這個指令來建立工作排程之後,該項工作就會被紀錄到 /var/spool/cron/ 裡面去了,而且是以帳號來作為判別的喔!舉例來說, dmtsai 使用 crontab 後, 他的工作會被紀錄到 /var/spool/cron/dmtsai 裡頭去!但請注意,不要使用 vi 直接編輯該檔案, 因為可能由於輸入語法錯誤,會導致無法執行 cron 喔!另外, cron 執行的每一項工作都會被紀錄到 /var/log/cron 這個登錄檔中,所以囉,如果您的 Linux 不知道有否被植入木馬時, 也可以搜尋一下 /var/log/cron 這個登錄檔呢! 好了,那麼我們就來聊一聊 crontab 的語法吧!
比較有趣的是那個『週』喔!當週為 0 或 7 時,都代表『星期天』的意思!另外, 還有一些輔助的字符,大概有底下這些:
我們就來搭配幾個例子練習看看吧!
那個 crontab 每個人都只有一個檔案存在,就是在 /var/spool/cron 裡面啊! 還有建議您:『指令下達時,最好使用絕對路徑,這樣比較不會找不到執行檔喔!』
真的是很簡單吧!呵呵!那麼,該如何查詢使用者目前的 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 的設定就自動的會來執行了!
好!你現在大概瞭解了這一個咚咚吧!OK!假設你現在要作一個目錄,讓系統可以每 2 分鐘去執行這個目錄下的所有可以執行的檔案,你可以寫下如下的這一行在 /etc/crontab 中:
如何!?建立例行性命令很簡單吧!如果你是系統管理員的話,直接修改 /etc/crontab 這個檔案即可喔!又便利,又方便管理呢! 一些使用特點:
有的時候,我們以系統的 cron 來進行例行性工作的建立時,要注意一些使用方面的特性。
舉例來說,如果我們有四個工作都是五分鐘要進行一次的,那麼是否這四個動作全部都在同一個時間點進行?
如果同時進行,該四個動作又很耗系統資源,如此一來,每五分鐘不是會讓系統忙得要死?
呵呵!此時好好的分配一些執行時間,呵呵!就 OK 啦!所以,注意一下:
當大量使用 crontab 的時候,總是會有問題發生的,最嚴重的問題就是『系統資源分配不均』的問題,
以鳥哥的系統為例,我有偵測流量的資訊,包括:
另外一個困擾發生在『 當有執行成果或者是執行的項目中有輸出的資料時,該資料將會
mail 給 MAILTO 設定的帳號 』,好啦,那麼當有一個排程一直出錯(例如 DNS
的偵測系統當中,若 DNS 上層主機掛掉,那麼你就會一直收到錯誤訊息!)怎麼辦?呵呵!還記得
BASH 與 Shell scripts
那一章吧!?直接以『命令重導向』將輸出的結果輸出到
/dev/null 這個垃圾桶當中就好了!
很多時候被植入木馬都是以例行命令的方式植入的,所以可以藉由檢查 /var/log/cron
的內容來視察是否有『非您設定的 cron 被執行了?』這個時候就需要小心一點囉!
本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
這個涉及命令重導向的問題,我們可以將他導入檔案或者直接丟棄!如果該訊息不重要的話,
那麼就予以丟棄,如果訊息很重要的話,才將他保留下來!假設今天這個命令不重要,
所以將他丟棄掉!因此,可以這樣寫:
at 1am 2006-02-14
在每星期的 1~5 ,下午 3 點的每分鐘,共進行 60 次 /usr/local/bin/tea_time.sh 這個檔案。
要特別注意的是,每個星期 1~5 的 3 點都會進行 60 次ㄟ!很麻煩吧~是錯誤的寫法啦~
應該是要寫成:
30 15 * * 1-5 /usr/local/bin/tea_time.sh
這一行代表......沒有任何意義!因為語法錯誤!您必須要瞭解,在 /etc/crontab
當中每一行都必須要有使用者才行!所以,應該要將原本那行改成:
25 00 * * 0 root /usr/local/bin/backup.sh
因為 FC4 系統預設的例行性命令都放置在 /etc/cron.* 裡面,所以,你可以自行去:
/etc/cron.daily/, /etc/cron.week/, /etc/cron.monthly/ 這三個目錄內看一看,
就知道啦! ^_^
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:呼呼!終於完成風格囉~同時加入一些習題練習。 |
|||||||||||||||||||||||||||||||||||||