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)