2008年4月7日星期一

Cronjob

Cron 是UNIX, SOLARIS,LINUX下的一个十分有用的工具。通过Cron脚本能使计划任务定期地在系统后台自动运行。这种计划任务在UNIX, SOLARIS, LINUX下术语为cron jobs。 Crontab ( cron 表)则是用来记录在特定时间运行的 cron 的一个脚本文件。

Crontab归结为以下几点特性:
A. Crontab约束
当用户名记录在文件/usr/lib/cron/cron.allow时,该用户的crontab有效。当/usr/lib/cron /cron.allow 文件不存在时,用户名没被记录在/usr/lib/cron/cron.deny文件中,该用户的crontab也有效。当只存在/usr/lib /cron/cron.deny且为空时,所有的用户都可使用crontab。当前两个文件都不存在时,只有root用户可以使用crontab。 Deny或allow记录以每行一个用户名的形式记录信息。

B. Crontab 命令

  • export EDITOR=vi 为crontab文件指定一个编辑器

  • crontab -e 编辑该用户的crontab,当指定crontab 不存在时新建。

  • crontab -l 列出该用户的crontab

  • crontab -r 删除该用户的crontab

  • crontab -u<用户名称> 指定要设定crontab的用户名称

  • crontab –v 显示上一次编辑的时间(只在某些操作系统上可用)



C. Crontab 文件
Crontab语法一个crontab文件用五个段来定义:分,小时,天,月份和周日,和一个要定期执行的命令代码。
[text]
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0 - 6) (Sunday=0)
| | | +------- month (1 - 12)
| | +--------- day of month (1 - 31)
| +----------- hour (0 - 23)
+------------- min (0 - 59)
[/text]

所有的值都必须在相应的范围之内,否则视为无效。在填值区域内可以是 * 也可以是以 , 分隔的一组值。值可以是一个数据也可以是用连接符连起来的两个数(表示范围)。
注:日期的格式可以是星期,也可以是一个月中的天。假如两个都有值,则在这两个时间都会执行。

D. Crontab 实例
下面是crontab文件中的一行,意思是在每天下午6:30中删除临时文件(临时文件存放在/home/someuser/tmp)。
[bash]
30 18 * * * rm /home/someuser/tmp/*
[/bash]
以下我们改变参数的值使其在不同的时间运行:如下表







































min hour day/month month day/week Execution time
30 0 1 1,6,12 * --00:30 on 1st of Jan,June & Dec
0 20 * 10 1-5 --8:00 PM every weekday(Mon-Fir) only in Oct
0 0 1,10,15 * * --midnight on 1st,10th & 15th of month
5,10 0 10 * 1 --At 12:05 12:10 every Monday & on 10th of every month


注:要是无意间键入了没带参数的crontab 命令,别 Control-d 退出,这样会删掉所有的cronjob。 应该 Control -c 退出.
在以上任何值中,星号 * 可以用来代表所有有效的值。譬如:月份值中的星号意味着在满足其它制约条件后每月都执行该命令。
整数间的短线 - 指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。
用逗号 , 隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。
正斜线 / 可以用来指定间隔频率。在范围后加上 / 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。
开头为井号# 的行是注释,不会被处理。

E. Crontab 环境设置
Cron其实是在shell(/usr/bin/sh).后台引用用户程序的命令。
Cron默认的shell环境是:
[bash]
HOME=user's-home-directory
LOGNAME=user's-login-id
PATH=/usr/bin:/usr/sbin:
SHELL=/usr/bin/sh
[/bash]
用户希望自己的配置文件在表或者脚本的入口直接执行。

F. 禁用邮件默认的cronjobs在执行任务时会给用户发一封邮件。如果您不需要的话可以通过以下命令关闭。 >/dev/null 2>&1

H. 生成日志文件保存cronjobs日志只需作如下设置就可以
[bash]
30 18 * * * rm /home/someuser/tmp/* > /home/someuser/cronlogs/clean_tmp_dir.log
[/bash]
/home/someuser/cronlogs/clean_tmp_dir.log 为日志文件保存的绝对路径


常用的crontab命令:

  • crontab -l 显示所有现存cron job.

  • crontab -r 删除当前cron jobs.

  • crontab -e 编辑当前 crontab file.

    编辑/etc/crontab 文件配置 cron
    cron服务每分钟不仅要读一次/var/spool /cron内的所有文件,还需要读一次/etc/crontab,因此配置这个文件也能运用 cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:
    [bash]
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root #如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
    HOME=/
    # run-parts
    01 * * * * root run-parts /etc/cron.hourly #每个小时去执行一遍/etc/cron.hourly内的脚本
    02 4 * * * root run-parts /etc/cron.daily #每天去执行一遍/etc/cron.daily内的脚本
    22 4 * * 0 root run-parts /etc/cron.weekly #每星期去执行一遍/etc/cron.weekly内的脚本
    42 4 1 * * root run-parts /etc/cron.monthly #每个月去执行一遍/etc/cron.monthly内的脚本
    [/bash]

    注意: run-parts,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。root 表示运行该命令的用户名。

    看下面的内容:
    cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。
    cron 假定系统持续运行。如果当某任务被调度时系统不在运行,该任务就不会被执行。
    要使用 cron 服务,必须安装了 vixie-cron RPM 软件包,而且必须在运行 crond 服务。要判定该软件包是否已安装,使用 rpm -q vixie-cron 命令。要判定该服务是否在运行,使用 /sbin/service crond status 命令。

    cron 的主配置文件是 /etc/crontab,它包括下面几行:
    [bash]
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/

    # run-parts
    01 * * * * root run-parts /etc/cron.hourly
    02 4 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly
    [/bash]

    前四行是用来配置 cron 任务运行环境的变量。 SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell), PATH 变量定义用来执行命令的路径。cron 任务的输出被邮寄给 mailto 变量定义的用户名。如果 mailto 变量被定义为空白字符串 (mailto=" "),电子邮件就不会被寄出。HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

    /etc/crontab 文件中的每一行都代表一项任务。

    如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到 /etc/cron.d 目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。如下:
    [bash]
    #record the memory usage of the system every monday at 3:30AM in the file /tmp/meminfo
    30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
    #run custom script the first day of every month at 4:10AM
    10 4 1 * * /root/scripts/backup.sh
    [/bash]

    根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在 /var/spool/cron 目录中,并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令,使用由 VISUAL 或 EDITOR 环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和 /etc/crontab 相同。当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,并写入文件 /var/spool/cron/username 中。

    cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及 /var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。

    /etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了,cron 守护进程 (crond) 不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。

    无论使用控制文件中的规定如何,根用户都总是可以使用 cron。
    如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且 cron.deny 文件会被忽略。
    如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用 cron。

    • /sbin/service crond start 启动 cron 服务,推荐在引导时启动该服务

    • /sbin/service crond stop 停止 cron 服务



    增加 cron 的工作
    当决定要在系统上定期执行某个命令,必须将这个要执行的命令定义成一个 cron 工作,可以直接将要建立的 cron 工作定义在 cron TAB设置文件中,设置该命令执行的时机;或者也可以利用 cron 会定时执行 /etc/cron.*目录 scripts 的特性,将要执行的命令建立成为一个脚本文档,放置在该目录下,并且注意它的权限必须可以执行.

没有评论:

发表评论