2011
Apr
18

在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。

.bash_profile
  1. SSH_ENV=$HOME/.ssh/environment
  2. function start_agent {
  3. echo "Initialising new SSH agent..."
  4. /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
  5. echo succeeded
  6. chmod 600 ${SSH_ENV}
  7. . ${SSH_ENV} > /dev/null
  8. ssh-add id_rsa
  9. }

接下來修改 /etc/crontab ,將備份的指令輸入就可以了,如果想看執行的 Log ,可以在指令的最後補上 「 2>&1 &> ~/cronLog」,這樣程式就會將結果存到 ~/cronLog。

/etc/crontab auto scp
  1. 1 1 * * * userxx . /home/userxx/.ssh/environment && /usr/bin/scp puritys.me:~/var/backup/* ~/

這個範例是每天自動備份另一台機器的資料,但是時間一久 ,備份的資料會越來越多,最後硬碟會撐不住,所以又要加一個自動刪除舊檔的 cron job,下面這個範例會自動刪除五天前的 gz 備份檔。

/etc/crontab auto rm
  1. 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

回應 (Leave a comment)