在linux系統中,如 freebsd,cron 排程的資料是存在/etc/crontab中,我們可以直接輸入 vi /etc/crontab進行編輯。
Linux Cron 指令
- crontab -e 編輯排程 (edit cron)
- crontab -r 移除排程 (remove cron)
- crontab -l 顯示目前排程 (list cron)
- crontab -u 改變排程的執行身分: crontab -u user filename
Cron 語法介紹
分鐘 |
小時 |
日 |
月 |
星期 |
執行身份 |
指令 |
---|---|---|---|---|---|---|
0~59 |
0~23 |
1~31 (29,30) |
1~12 |
0~6 0是星期日,6是星期六 |
帳號 |
/usr/bin/xxxx |
Cron 範例 ( Example )
每5分鐘執行一次
*/5 * * * * root /usr/libexec/atrun
每5小時執行一次
* */5 * * * root /usr/libexec/atrun
1至20號每天執行一次
0 1 1-20 * * root /usr/libexec/atrun
當分針移到第5分時,執行此 cron
5 * * * * root /usr/libexec/atrun
當時針移到1點 1 分時,執行此 cron
1 1 * * * root /usr/libexec/atrun
每週一的1點1分,執行
1 1 * * 1 root /usr/libexec/atrun
2月29日時針到1點1分,執行
1 1 29 2 * root /usr/libexec/atrun
8點到16點每5分鐘執行一次 cron
*/5 8-16 * * * root /usr/libexec/atrun
start cron
在 Linux 中,有個程式叫 crond ,意思是 cron daemon,大部分的 Linux 系統都會自動背景啟開這個程式,但是有時候會碰到 cron 沒有啟動的狀態,啟動方式如下:
! sudo service crond start啟動之後,我會使用 tail -f /var/log/cron
這個指令來檢查 /etc/crontab 中的程式,是否有正確的被執行。
如何讓 cron job 自動 SCP 備份資料
首先我們要啟用 SSH Agent,有了 SSH Agent ,就能夠執行 scp 指令,並且自動通過輸入密碼的過程。
先在個人目錄下新增 .bash_profile ,並加入以下的內容,加入完成後得重新載入 .bash_profile , 使用指令「source ~/.bash_profile」,之後我們就可以用 start_agent 啟動 SSH Agent。
- SSH_ENV=$HOME/.ssh/environment
- function start_agent {
- echo "Initialising new SSH agent..."
- /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
- echo succeeded
- chmod 600 ${SSH_ENV}
- . ${SSH_ENV} > /dev/null
- ssh-add id_rsa
- }
接下來修改 /etc/crontab ,將備份的指令輸入就可以了,如果想看執行的 Log ,可以在指令的最後補上 「 2>&1 &> ~/cronLog」,這樣程式就會將結果存到 ~/cronLog。
- 1 1 * * * userxx . /home/userxx/.ssh/environment && /usr/bin/scp puritys.me:~/var/backup/* ~/
這個範例是每天自動備份另一台機器的資料,但是時間一久 ,備份的資料會越來越多,最後硬碟會撐不住,所以又要加一個自動刪除舊檔的 cron job,下面這個範例會自動刪除五天前的 gz 備份檔。
- 40 1 * * * userxx /usr/bin/rm `date --date="-5 day" +\%Y-\%m-\%d`*.gz
日期運算另一種寫法 date -d "-1 day" +"%Y-%m-%d"
sleep 一段時間
Cronjob 最短只能設定到每分鐘執行,如果你想要設定就某幾秒可以執行,那麼可以用 perl sleep 來達成。
40 1 * * * userxx perl -e 'sleep(int(rand(60 * 60 * 24)));' && run xx