之前我们有了解到一次性工作at,在linux的作业管理中我们还会使用到周期性的管理工作。例如,每周或者每天我们希望执行一个脚本。这时我们就要使用周期性的作业调度crontab。

   我们先来了解一下与crontab命令相关的配置文件。既然是要了解配置文件我们当然是去/etc目录下找了。

wKioL1LV7PXA23r2AAC7H_pMisA239.jpg

/etc/cron.deny:用于设置不允许那些用户使用crontab。系统默认会生成的文件。如果有需要你也可以自己手动生成/etc/cron.allow文件,用于设定那些用户可以使用crontab命令。cron.allow的运行级别比cron.deny高,即两个文件同时存在并且文件里面的设置有冲突的时候,以cron.allow为准。

/etc/crontab:这个是例行工作调度的一个配置文件。我们需要执行的周期性的例行工作,除了可以用crontab命令产生以外,也可以通过编辑/etc/crontab文件来实现。当我们使用crontab命令的时候相关的作业信息会保存在/var/spool/cron下,与创建用户同名的文件中。我们也可以通过写/etc/crontab配置文件的方式来设置周期性任务。

/etc/cron.d:这个目录下面放置了很多与系统相关的周期性任务。

/etc/cron.daily:这个目录下都是放的脚本文件,每天都会被执行的脚本放在这个目录下,通过/etc/crontab中的配置来调用。/etc/cron.hourly目录下放置每个小时都会执行脚本。/etc/cron.monthly放置每个月会被执行的脚本。/etc/cron.weekly放置每周被执行的脚本。

   总结一下设置周期作业的三种方式。周期性任务必须要crond这个守护进程来调度。crond这个daemon会检查/etc/crontab,/etc/cron.d/,/var/spool/cron。

第一、通过crontab命令实现。一旦设置会在/var/spool/cron生成同用户名一致的文件。文件的内容为设置的周期任务的内容。所有用户都可以通过这种方式来制定周期性任务。

第二、配置/etc/crontab调度/etc/cron.hourly,/etc/cron.daily,/etc/cron.monthly,/etc/cron.weekly下面所存放的脚本。一般与系统运营维护相关的周期行任务采用这种方式。

第三、/etc/cron.d目录下的文件,这里的文件同/var/spool/cron下的文件类似,但是一般都是存放同系统相关的周期性任务,其配置的一般都不是脚本而是调用的系统命令。


第一种方式:通过crontab命令设置周期行任务

crontab [-elr] [file]

   -e:编辑周期性任务。

   -l:列出周期性任务。

   -r:删除周期性任务。

   -u:管理员用于现实其他用户的周期行任务。

crontab -e:当我们在命令提示符下输入如下命令以后,会为我们打开一个vim的文本编辑程序。这个时候我们就可以开始指定我们周期行任务执行的时间和任务的内容了。想记录流水账一样,每一行代表一个周期性任务。

           mintue    hour    date    month    week    command

范围    0-59        1-24    1-31    1-12        0-7(0,7都表示星期天)

*:如果相应位为*表示不做限制。

,:代表分隔时段。比如0 3,6 * * * command。表示每天的3:00和6:00执行。

/n:代表每间隔n个单位的时间执行,比如*/10 * * * * command。表示每过10分钟执行一次。

-:代表指定时间范围。15 21-23 * * * command。表示每天的九点一刻,十点一刻,十一点一刻执行

我们希望每天的晚上10点将日志文件发到root的邮箱。

wKioL1LWJbuyxK9zAAAcwZxErJM098.jpg

当我们设置好这个周期性任务以后我们可以在/var/spool/cron/下看到同用户同名的一个文件,文件的内容即周期任务的设置内容

wKiom1LWJu7i7eBFAAA46w58-No995.jpg

crontab -l所显示的结果同上面的结果一样。需要注意的是crontab -l只显示当前用户的周期性任务,如果你是一个管理员你需要显示其他用户的管理性任务,你需要使用crontab -u username -l。来显示其他用户的周期性任务。并且你通过配置/etc/crontab和/etc/cron.d所产生的周期性任务是没有办法用crontab -l来显示的。

crontab -r用于删除周期性的任务。需要注意的是这个命令会删除所有的周期性任务,如果你要删除的是其中的一条周期性任务,你需要使用crontab -e命令打开编辑器,然后再删除相应的条目。

crontab命令还可以通过读取文件的方式来执行。我们可以将需要执行的周期任务写入文件中,然后执行crontab filename。但是需要注意的是,你写入的内容同你在执行crontab -e后写入的内容是一致的。即时间的后面不能跟用户(这里有别于/etc/cron.d和/etc/crontab设置周期行任务,/etc/cron.d目录下的文件和在/etc/crontab中设置周期性任务,时间后面必须跟用户名)

wKiom1LYm9iAMWjpAACTENPoDCk304.jpg

第二种方式。将写好的周期性任务文本放到/etc/cron.d目录下。

我们还是以test这个测试文件为例,在将test这个文件拷贝到/etc/cron.d目录下之前,我们需要对test文件先做下修改,在时间的后面增加上一个用户名称。

wKioL1LY1w7htRr7AABqx8ek6pg742.jpg

这样一个周期性任务就创建好了,但是通过这种方式创建的周期性任务,用crontab -l是没有办法查看到的,这个一定要注意。

第三种方式。通过配置/etc/crontab。或者将需要定期运行的脚本文件放到相应的目录。

让先来看看/etc/crontab

wKioL1LYuX_g0AkCAADym190xbE495.jpg

文件开头定义了环境的变量,默认使用的SHELL,默认的路径,邮箱,以及家目录。可以看到PATH变量定义了4个目录,如果周期性任务所使用到的命令不在PATH定义的路径中,一定要使用绝对路径。如果我们所执行的周期性任务会有标出的输出信息或者有错误的输出,那么系统会发邮件给MAILTO中定义的用户。所以我们之前用到的test中定义的周期性任务也可以写到/etc/crontab中。

wKioL1LYz67z2nltAAEXNzESZ1c096.jpg

但是当我们用crontab -l的时候是看不到这个任务的哟。

/etc/crontab这个配置文件还有更高级的玩法就是将我们需要运行的脚本放到相应的目录中,然后在/etc/crontab中设置好时间和目录,系统将定期去执行指定目录中的脚本,在CentOs6.3中系统默认给我们创建了/etc/crond.daily,/etc/cron.hourly,/etc/cron.monthly,/etc/cron.weekly。四个目录用于分别存放每天,每小时,每月,每周要运行的脚本。

例如:

wKiom1LY1_PQw0uWAAEeMFqvpCE969.jpg

然后我们在/etc/cron.hourly目录下写一个test脚本,并且给这个脚本可执行的权限

wKiom1LY1PKgqDKNAAA5VetL2fc865.jpg

一个周期性的任务就设置好了,crontab -l同样是无法显示有这个任务的。run-parts是一个脚本,位于/user/bin下,所以不使用绝对路径也能运行,这个脚本会去运行指定目录中的脚本。

所以当我们怀疑我们主机可能被别有用心的人布置了周期行任务,只是用crontab -l是不够的,我们还要查询一下我们的配置文件是否有不良信息。