cron & crontab

cron & crontab

每個人應該都會有這樣的需求: 每天, 或是每個星期 要做某一個工作, 並且這個工作是定期去做的, 這個工作可能是執行一條命令, 或是執行一個腳本. 這時你可能會用到cron服務.

cron服務一共分兩個部分: cron服務, crontab.


cron服務

cron服務默認是開啓的, 也不需要我們做什麼特殊的配置, 我們只要知道它大概的工作原理就好了.

cron會檢查 /var/cron/tabs/ 目錄下的crontab文件, 這些文件都是用 /etc/passwd 文件中的用戶帳號的命名的. 被查找到的crontab文件會被加載到內存中. cron 同時還會檢查 /etc/crontab 文件, 這個文件是系統的crontab文件, 格式和我們通常用到的crontab文件不太相同, 這裏就不做說明了.

cron 會每分鐘執行一次上面說到的檢查, 檢查時會確定crontab文件中的每一條任務是否應該在當前這一分鐘執行. 需要注意的是cron只會檢查當前賬戶對應的那個crontab文件, 但是/etc/crontab 文件會在任何賬戶下都被檢查. 當crontab中的任務時, 任何輸出都會默認發送到crontab對應的賬戶郵箱中(/var/mail/)

另外, cron還會每分鐘檢查一下存放crontab文件的目錄的修改時間, 如果修改時間發生變化, 就將所有的crontab文件重新加載到內存中.


crontab

crontab命令是用來添加,修改和刪除crontab文件中的任務的.

如果在/var/cron/ 目錄中有 allow 文件, 那麼只有allow文件中列出來的用戶可以使用crontab命令. 如果 不存在allow文件, 但是存在一個deny文件, 那麼deny文件中列出來的用戶將被禁止使用crontab命令. 如果這兩個文件都不存在, 那麼就要根據 site-dependent configuration parameters 來確定了, 有可能是隻有root才能使用這個命令, 或者是所有用戶都可以使用這個命令.

下面是crontab命令用到的一些參數:

-u

指定crontab命令將要修改的是哪一個用戶的crontab文件, 如果沒有指定該參數, 則默認是當前賬戶的crontab文件.
這裏需要注意的是在普通賬戶下使用su提權後, 如果使用crontab命令, 這會讓crontab命令迷惑, 所以這時一定要使用-u參數來指定用戶.

-l

列出當前crontab文件中的任務.

-r

刪除當前用戶的crontab文件.

-e

編輯當前的crontab文件, 使用默認的文本編輯器打開crontab文件, 一般應該都是vi. 可以通過修改EDITOR或是VISUAL環境變量來修改默認的編輯器.

crontab文件的格式

# 文件格式說明 
# |----------- 分鐘 (0 - 59) 
# | |--------- 小時 (0 - 23) 
# | | |------- 日 (1 - 31) 
# | | | |----- 月 (1 - 12) 
# | | | | |--- 星期 (1 - 7) 
# * * * * * 被執行的命令

舉例:

1 * * * * ls -l 
這一條任務的含義是 在每個小時一分鐘的時候 執行命令: ls -l
其中 * 表示 每分鐘 或是 每小時 或是 每天 等等.

*/3 * * * * ls -l 
這一條任務的含義是 每隔3分鐘執行命令 ls -l 
這就不用我解釋了吧

重定向輸出. 前面已經提到, crontab中的任務默認將輸出作爲郵件發送給你, 但有時你並不關心輸出, 這是你就可以這樣寫:

* * * * * ls -l > /dev/null 2 > &1 
這句話的意思是將原本輸出到標準輸出的內容輸出到 /dev/null, 因爲 /dev/null 表示空設備, 所以原本該輸出的東西就不輸出了.
2 > &1 表示 將錯誤信息輸出到和標準輸出相同的地方, 即 /dev/null 
注: 1 表示標準輸出, 2 表示錯誤輸出, 至於 & 符號, 你可以參照一下C++中的引用, 我就是這麼理解的 :)

還有的時候, 你可能想讓原本輸出到標準輸出的內容還是輸出到標準輸出, 這時候你可以用下面的方法:

首先使用 tty 命令顯示你當前的 tty 編號, 例如我的是 /dev/ttyv1
接着將輸出重定向到ttyv1:
* * * * * ls -l > /dev/ttyv1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章