JUN

cron 设定指南
昨天用crontab设定的nginx分割没有生效,是因为我自己对这个东西了解得不够系统,今天上网搜了一下,又是一篇...
扫描右侧二维码阅读全文
28
2014/07

cron 设定指南

昨天用crontab设定的nginx分割没有生效,是因为我自己对这个东西了解得不够系统,今天上网搜了一下,又是一篇日文日志写得非常详细,就搬运一下吧。
个人感觉日本方面这类指南写得是非常详细和贴和新手,非常有帮助。翻译还是那么屎我的中文已经没得救了。另外,文章会进行适当的增删。
译自:https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html
by junorz.com

1.开始
cron 是一个可以自动执行任务(或脚本)的一个Daemon进程。在管理Linux系统的时候,有很多想要自动执行的例如日志分割、备份这样的操作。特别是像备份这样的操作会给系统造成比较大的负荷,通常是需要在访客较少的深夜或清晨时段进行。
像这样需要定期执行的任务,可以使用一个叫crond的守护进程进行自动化管理。于是这次我想就cron需要用到的命令、设定文件进行说明。

2.设定步骤
■ 设定步骤
这篇文章会按照以下的顺序来对cron进行说明。
首先,在Linux上为了使用cron,需要启动相关服务、确认服务状态,如果服务在停止状态则需要将它启动。
其次,我们会对设定cron时需要用到的命令、设定文件(/var/spool/cron/user)、(/etc/crontab)进行说明。
另外,我们还可以限制crontab的使用权限。在文章的最后我会再举几个简单的例子。

■ 其它
此文章是在参考了crontab的参考手册之后对cron的基本设定方法进行说明。此文章没有说明到的内容可以执行以下命令来查看crontab手册,或者你可以在Internet上使用搜索功能。

# man 5 crontab

3.准备
■ 启动服务
使用cron需要启动crond服务。通常在安装的时候会自动启动,我们可以用下面这条命令来确认crond的状态。

# /etc/rc.d/init.d/crond status
crond (pid xxx) is running...

如果crond没有启动的话,需要手动将它启动。如果你想把它加到系统启动项里,可以像下面这样做。

# /etc/rc.d/init.d/crond start
Starting crond:     [  OK  ]
# chkconfig --level 2345 crond on     ・・・(注1)
# chkconfig --list crond              ・・・(注2)
crond     0:off  1:on  2:on  3:on  4:on  5:on  6:off

注1 在2,3,4,5启动级的时候启动
注2 确认设定结果

■ cron的设定文件
如下表,crond会每分钟对下面列出的设定文件是否有变更进行确认,如果有变更会立即反映至系统执行。

文件/文件夹名 利用者 主要用途
/var/spool/cron/user 所有用户 用户的自动任务设定文件
/etc/crontab root 每小时、每日、每月、每周自动任务的主要设定文件
/etc/cron.hourly root 放置每小时自动执行的任务文件的文件夹
/etc/cron.daily root 放置每天自动执行的任务文件的文件夹
/etc/cron.monthly root 放置每月自动执行的任务文件的文件夹
/etc/cron.weekly root 放置每周自动执行的任务文件的文件夹
/etc/cron.d root 放置以上所述情况之外自动执行的任务文件的文件夹

■ crontab命令格式
crontab文件是在用crontab命令操作cron的时候生成的、为了定期执行进程的文件。它的格式如下:

# crontab [- u user] {-l|-r|-e}

它的参数请参考下表。

可选参数
-e 以对话的形式编辑crontab。通常是启动vi编辑器来编辑设定文件。
-l 显示crontab文件内容。(译者注:是显示登录用户所对应的crontab文件)
-r 删除crontab文件。
-u user 操作指定用户的crontab文件。另外,这个参数只限于root使用。

■ crontab命令的使用例
下面我们来介绍一些crontab的例子。

root用户在显示test用户文件的时候:

# crontab -l -u test

编辑自己crontab文件的时候:

# crontab -e

4.设定文件(/var/spool/cron/user)
■ 「/var/spool/cron/user」文件的格式
在crontab文件里,是以“在这个日期的这个时刻,执行这条命令”的格式向crond下达命令。另外,每个用户都拥有一个在/var/spool/cron文件夹下以自身名字命名的crontab文件。用户使用的命令只能操作自己的crontab文件,在实际使用的时候需要注意。
在这个文件里,大致上来说会包含注释行、环境变量的设定、cron命令这几种。注释行和通常的文件一样以“#”作为行头。
要编辑这个文件可以使用“crontab -e”命令。

■ 环境变量的设定
环境变量以下面的格式进行设定。

环境变量名 = 值

环境变量名一般会由crond自动设定。具体来说,SHELL会被设定成“/bin/sh”,LOGNAME和HOME会参考“/etc/passwd”中crontab所有者的信息设定。但是这些默认被赋值的SHELL和HOME都可以进行变更。
另外,可以通过MAILTO值的设定用邮件通知crontab的执行结果。

MAILTO = user

crontab的执行结果会发送到所指定的user。当需要发送到多个用户时,在用户之间以半角逗号“,”分开。如果设定MAILTO=''或者MAILTO=""则不发送邮件。另外,在不指定MAILTO参数的情况下,crontab的执行结果会发送给crontab的所有者。

■ cron命令设定
在crontab文件中,以6个字段记述cron命令[系统的crontab文件(/etc/crontab)有7个字段(分、时、日、月、星期、用户名、命令)],来指定命令的执行时间。具体如下,设定可用值请参照表1。
各个字段都可以使用“*”通配符。

分 时 日 月 星期 命令
表1
0-59
0-23
1-31
1-12 或 jan-dec
星期 0-7 [0,7是星期天 或者 sun-sat]
命令 记述有效的命令。可以为空白,以标准的Bourne Shell格式记述。

此外,在crontab文件里还可以指定列表和范围。列表是指,在一个字段里设置多个数值。范围是指,在一个字段里设置特定范围的值。而且列表和范围是可以在一个字段里共存的。再者,间隔值(在指定间隔里执行一次命令)也可以进行设定。

表2
设定例 说明
列表 0,15,30,45 若在在分字段里,则表示每15分钟执行一次命令。
范围 1-5 若在星期字段里,则表示周一~周五执行。
共存 1,3,7-9 若在小时字段里,则表示1点、3点、7点、8点、9点执行命令。
间隔值 1-5/2 若放在小时字段里,则表示1点、3点、5点执行命令。间隔值在“/”之后,以指定的间隔执行命令。

5. 设定文件(/etc/crontab)
■ /etc/crontab
通常在这个文件里会像下面这样,按照所指定的时间执行cron.monthly、cron.weekly、cron.daily、cron.hourly目录下的文件。

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

0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg

(译者注:似乎现在版本的crontab文件里已经没有run-parts这段了,但是这些cron.houly...文件夹下的文件依然会执行。不知为何。)
这个文件也像/var/spool/cron/user文件一样,包含注释行、环境变量的设定、cron命令,但是cron命令的设定格式略有不同。
具体在[4.crontab文件]的[■ cron命令设定]里已经有简单提到,这个文件多出一个用户字段,就像下面这样共分为7个字段。

分 时 日 月 星期 用户 命令

但是,<span style="font-color: red;">我们不推荐直接在RedHat系列的Linux上进接编辑这个文件</span>,定期任务请在cron.monthly、cron.weekly、cron.daily、cron.hourly目录下的文件,或者使用crontab命令在/var/spool/cron/user文件里设定。

■ /etc/cron.monthly、cron.weekly、cron.daily、cron.hourly
如上述,这些文件夹里的Shell脚本会根据/etc/crontab里设定的时间来执行。
例如 /etc/cron.daily/logrotate 文件会有如下设定:

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf

在这些文件夹下保存的Shell脚本会被付与执行权。如果在这里不给他们执行权限这些脚本便不会执行,需要特别注意。

# chmod 755 /etc/cron.daily/logrotate

另外,在这些文件夹下保存的Shell脚本不能自定义时间,如果想要在任意的时间执行命令的话,请使用crontab命令,在 /var/spool/cron/user 文件里设定。

6.限制访问
■ 限制访问
cron在默认情况下所有的用户都可以使用,但是可以对其进行限制。方法是,在许可使用的情况下,生成/etc/cron.allow文件,每行一个用户。相反地,如果是不希望用户使用,则生成/etc/cron.deny文件,每行写一个用户。下面这个例子就是仅许可一个叫“hoge”用户使用的情况下,/etc/cron.allow文件的设定。

# vi /etc/cron.allow
hoge

另外,根据「/etc/cron.allow」「/etc/cron.deny」文件的存在情况,可使用的用户也会有所不同。例如,两个文件都不存在的情况下,所有用户都可以使用crontab命令。「/etc/cron.allow」文件存的时候、就算「/etc/cron.deny」存在,其内容也会被系统无视,仅会允许在「/etc/cron.allow」文件里记录的用户。
详细情况请参照下表。

cron.allow cron.deny 可使用的用户
所有用户
无视 在cron.allow里登录的用户
在cron.deny里未登录的用户
有(无内容) 无视 所有用户都不能使用
有(无内容) 所有用户

7.设定例
■ 设定例
最后介绍一下在crontab的man页面里记载的内容。

# man 5 crontab

CRON 文件例
# (无视在/etc/passwd中指定的shell)执行命令时总是使用/bin/sh。
SHELL=/bin/sh
# (无视此crontab的所有者)所有结果都向paul发送邮件。
MAILTO=paul
#
# 每天在日期变更之后5分钟执行
5 0 * * *       $HOME/bin/daily.job &amp;gt;&amp;gt; $HOME/tmp/out 2&gt;&amp;1
# 每月第一天的2:15pm执行 结果向paul发送邮件
15 14 1 * *     $HOME/bin/monthly
# 周末的晚上10点执行 提醒乔伊
0 22 * * 15 mail s &quot;已经晚上10点&quot; joe%乔伊,%%你的儿子在哪儿呢?%
23 023/2 * * * echo &quot;每天 0,2,4..点的23分执行&quot;
5 4 * * sun     echo &quot;每个星期天的4点5分执行&quot;
Last modification:October 20th, 2016 at 08:44 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment