:::

在Linux中用指令新增排程 / How to Create a Cron Job via Shell Script

image

最近我想要為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的指令都只會有一個,不會重複。

2017-09-04_162540

這樣就完成囉。

我們可以用「crontab -l」來檢視指令是否有新增到crontab中,詳細請看鳥哥「15.3 循環執行的例行性工作排程」的介紹。