运维日记018 -- Linux下的cron定时任务管理

运维日记018 – Linux下的cron定时任务管理

当最小化安装RHEL6后,定时器服务crond已经安装并默认开启了。定时器crond这个服务使得系统可以安排定时任务。

# chkconfig --list | grep crond
crond           0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

可以通过以下方式查看crond服务当前的运行状态:

# service crond status
crond (pid  1032) is running...

# pgrep crond
1032

# ps aux | grep crond
root      1032  0.0  0.1 117208  1372 ?        Ss   10:37   0:00 crond
root      1243  0.0  0.1 103240   880 pts/0    S+   16:17   0:00 grep crond

crontab命令

用户可以使用crontab命令设定或者查看定时任务。该命令的主要用法如下:

  • crontab -l [-u usrer]
    列出某个用户cron服务的详细内容

  • crontab -r [-u usrer]
    删除某个用户的cron服务

  • crontab -e [-u usrer]
    编辑某个用户的cron服务

例如,root用户想删除wjm用户的定时任务,可以如下操作:

# crontab -u wjm -r

当crontab使用-e参数时,会自动打开vi编辑器,可以按照规定语法格式编辑定时任务。其语法格式为:

Minute  Hour  Day  Month  Week  command
分钟    小时    天   月     星期    命令
0-59   0-23   1-31 1-12   0-6   command

在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。

整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。

用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。

正斜线(/)可以用来指定间隔频率。在范围后加上 / 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。

开头为井号(#)的行是注释,不会被处理。

例如,安排一个定时任务,每周一到周五的早上九点和下午五点向控制台发出一个提示信息“Work!”。可以这样实现:

0   9,17    *   *   1-5     wall ‘Work!’

例如,安排一个定时任务,每天删除/home/wjm/log目录下五天前的文件:

0   2   *   *   *   find /home/wjm/log -type f -mtime +5 -exec rm {} \;

crontab的配置文件

cron有两个配置文件,一个是一个全局配置文件(/etc/crontab),是针对系统任务的;一组是crontab命令生成的配置文件(/var/spool/cron下的文件),是针对某个用户的,定时任务配置到任意一个中都可以。

我们打开/etc/crontab文件,它包括下面几行:

# cat /etc/crontab
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

前四行是用来配置 cron 任务运行环境的变量:

SHELL变量的值指定shell环境(此处默认为bash shell);PATH变量定义用来执行命令的程序路径;cron任务的输出被邮寄给MAILTO变量定义的用户名,如果MAILTO变量被定义为空白字符串(MAILTO=”“),电子邮件就不会被寄出;HOME变量可以用来设置在执行命令或脚本时使用的主目录。

后面四行则指定由run-parts命令定期执行cron.hourly、cron.daily、cron.weekly和cron.monthly目录下的脚本。系统管理员可以将一些系统级的定时任务放在上面指定的几个目录下,便可以定期执行。

文件/etc/crontab是针对系统级的定时任务的,而一般用户配置的定时任务时,还是推荐使用crontab -e命令来实现。当用户用crontab -e配置了定时任务后,会在/var/spool/cron目录下生成一个和用户名相同的文件,可以直接用文本编辑器打开这个文件,文件的内容和用crontab -l显示的内容是一样的。

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

cron黑名单和白名单

可以通过编辑/etc/cron.allow和/etc/cron.deny文件,来允许/禁止用户设置定时任务。编辑完黑名单或者白名单后,需要重启crond服务以使之生效。

系统级定时任务

RHEL6安装好后,已经为用户配置好了一些系统级的定时任务,包含每小时、每天、每周、每月要执行的任务。

# ll -d cron*
drwxr-xr-x 2 root root 4096  16  2016 cron.d/
drwxr-xr-x 2 root root 4096 1021 08:01 cron.daily/
drwxr-xr-x 2 root root 4096  16  2016 cron.hourly/
drwxr-xr-x 2 root root 4096  16  2016 cron.monthly/
-rw-r--r-- 1 root root  722  29  2013 crontab
drwxr-xr-x 2 root root 4096  16  2016 cron.weekly/

我们在/etc目录下看到了cron.daily、cron.hourly、cron.monthly和cron.weekly几个目录,这些目录下都有一些可执行脚本,会定时的自动执行。当然,用户也可以把自己写的脚本放在对应的目录下,则该脚本也会定期自动的执行。

常见的几个每日执行的系统级定时任务

  • tmpwatch

这个任务可以定期清理特定目录(一般是/tmp或者/var/tmp)下的旧文件,避免这些目录不断膨胀。

习惯性的将一些临时文件放在tmp目录下,让其自然删除。同时,为了保证tmp目录不爆满,系统默认情况下每日会处理一次tmp目录文件,原理就是使用了tmpwatch。在系统最小安装情况下,这个功能是没有安装的。可以用以下命令安装:

# yum install tmpwatch

安装后会在/etc/cron.daily/目录下生成一个tmpwatch文件,这是一个可执行脚本,它的功能是删除/tmp和/var/tmp目录下一段时间内未被访问过的文件(/tmp下是10天,/var/tmp下是30天)。

  • logrotate

这个任务可以定期的回滚日志文件,避免日志文件变得过于大而使得读写效率下降。

  • logwatch

这是任务能定期将主机的log分析文件发送至指定的邮箱。

anacron

crontab可以指定任务在每天几点钟运行,可是如果那个指定时间机器没有开,那个任务便错过了时间而不再运行了。而anacron的意义就是处理非24小时一直开机的Linux系统的crontab执行。

anacron并不指定何时执行某项任务,而是启动后立刻去检测停机期间应该去执行而没有执行的crontab任务,并执行这些任务。

你可能感兴趣的:(系统运维,RHCE)