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
這裏需要注意的是在普通賬戶下使用su提權後, 如果使用crontab命令, 這會讓crontab命令迷惑, 所以這時一定要使用-u參數來指定用戶.
-l
-r
-e
crontab文件的格式
# |----------- 分鐘 (0 - 59)
# | |--------- 小時 (0 - 23)
# | | |------- 日 (1 - 31)
# | | | |----- 月 (1 - 12)
# | | | | |--- 星期 (1 - 7)
# * * * * * 被執行的命令
舉例:
這一條任務的含義是 在每個小時一分鐘的時候 執行命令: ls -l
其中 * 表示 每分鐘 或是 每小時 或是 每天 等等.
這一條任務的含義是 每隔3分鐘執行命令 ls -l
這就不用我解釋了吧
重定向輸出. 前面已經提到, crontab中的任務默認將輸出作爲郵件發送給你, 但有時你並不關心輸出, 這是你就可以這樣寫:
這句話的意思是將原本輸出到標準輸出的內容輸出到 /dev/null, 因爲 /dev/null 表示空設備, 所以原本該輸出的東西就不輸出了.
2 > &1 表示 將錯誤信息輸出到和標準輸出相同的地方, 即 /dev/null
注: 1 表示標準輸出, 2 表示錯誤輸出, 至於 & 符號, 你可以參照一下C++中的引用, 我就是這麼理解的 :)
還有的時候, 你可能想讓原本輸出到標準輸出的內容還是輸出到標準輸出, 這時候你可以用下面的方法:
接着將輸出重定向到ttyv1:
* * * * * ls -l > /dev/ttyv1