Sunday, 26. July 2009, 16:04:17
crontab在unix-like作業系統裡面,
允許我們在指定時間週期執行某個指令。
以下說明主要以FreeBSD作業系統為對象。
crontab除了系統性的/etc/crontab這個檔案外,
還有每個使用者自己的crontab。
系統性的/etc/crontab理論上一開始就有設定一些數值,
裡面也有相關欄位註解。
#minute hour mday month wday who command
就註解來看,各欄分別為
分(0-59) 時(0-23) 日(每月的第幾天,1-31) 月(1-12) 星期幾(0-7,0或7是Sunday) 執行身分 命令
一般使用者自己的crontab則大致和上述相同,
只是少了who那個欄位。
而crontab每分鐘都會執行,如果所設定的時間符合條件,就會執行對應的命令。
填入*的欄位代表從開始到結束(也就是那個欄位都符合)。
command則是相當於你要執行的命令,
不過這邊可能要注意一下PATH(執行檔搜尋路徑)和SHELL等環境變數的問題,
不然可能會發現找不到命令。
通常所執行的command,以絕對路徑方式表示(如/bin/ls而非只寫ls),可以減少因為PATH造成的問題,
若有需要,也可以藉由設定PATH變數,來設定自動搜尋的執行檔位置順序。
至於PATH等變數設定方法,可以參考/etc/crontab對應位置的寫法。
如果使用shell script等需要執行外部命令者,可能需要注意到script內指令的寫法,
可能也要注意到PATH變數的影響(怕crontab時的PATH變數和平常命令列下不同產生問題)。
詳細寫法可以
man 5 crontab
關於各使用者的crontab,可以使用
crontab -e
編輯自己的crontab檔。
或是
crontab 檔名
將指定檔名的檔案內容當成是你的crontab。
利用
crontab -l
可以顯示目前使用者的crontab內容。
這邊舉例一下各使用者的crontab寫法:
3 * * * * perl /root/ifconfig_log.pl > /dev/null 2>&1
這樣寫在每個小時3分的時候,去執行perl這個指令。
之所以不用寫絕對路徑,是因為他放在/usr/bin中,
而/usr/bin剛好在PATH中。
另外,想知道某個指令的絕對路徑,可以使用which這個命令:
~>which ping
/sbin/ping
其中/root/ifconfig_log.pl是餵給perl這個指令的參數,
而> /dev/null 2>&1則是sh(預設的SHELL)的輸出輸入導向寫法。