在Linux中用指令新增排程 / How to Create a Cron Job via Shell Script
最近我想要為Zentyal加上排程備份的時候,發現使用Shell Script指令修改 /etc/crontab 檔案並不會實際上觸發排程(儘管如果用vim /etc/crontab 是可以觸發排程的)。後來我參考TheBonsai的建議,用crontab指令來新增排程,這樣就可以成功。
用指令新增排程 / The shell script to create a cron job
根據TheBonsai的建議,指令如下:
crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
根據這個指令範本,我們來做客製化的設定。
排程時間 / Schedule
排程的時間有五個數字,參考鳥哥的說明,這些數字個別是:
- 分 minute (0-59)
- 時 hour (0-23)
- 日 day of month (1-31)
- 月 month (1-12, OR jan, feb, mar, apr…)
- 週 (0-7, Sunday=0 or 7, OR sun, mon, tue, wed, thu, fri, sat)
如果是要在週日早上6點執行,那麼數字設定是:(注意藍字)
crontab -l | { cat; echo "0 6 * * 7 some entryh"; } | crontab -
指令 / The job command
我通常會把要執行的指令寫成一個sh檔案,例如Zentyal的備份腳本backup-zentyal.sh。如果這個腳本檔擺放在 /root/backup-zentyal.sh 的話,那新增排程的腳本如下:(注意紅字)
crontab -l | { cat; echo "0 6 * * 7 /root/backup-zentyal.sh"; } | crontab -
不重複加入排程 / Avoid the same job
為了避免把同一個指令重複加入到crontab,那我們需要加一點防護機制。我先把crontab的內容用「crontab -l」指令調出來,然後用grep搜尋該指令是否已經存入crontab中。如果指令沒有在crontab中,那才加入指令。
做法如下:
LIST=`crontab -l`
SOURCE="/root/backup-zentyal.sh"
if echo "$LIST" | grep -q "$SOURCE"; then
echo "The back job had been added.";
else
crontab -l | { cat; echo "0 6 * * 7 $SOURCE"; } | crontab -
fi
這樣子,不管這串指令執行幾次,加入crontab的指令都只會有一個,不會重複。
這樣就完成囉。
我們可以用「crontab -l」來檢視指令是否有新增到crontab中,詳細請看鳥哥「15.3 循環執行的例行性工作排程」的介紹。