来自鸟哥的linux私房菜

以优先级来说, /etc/cron.allow/etc/cron.deny 要优先

  1. /etc/cron.allow: 将可以使用 crontab 的账号写入其中,若不在这个文件内的使用者则不可使用 crontab;
  2. /etc/cron.deny: 将不可以使用 crontab 的账号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab 。

当用户使用 crontab 这个指令来建立工作排程之后,该项工作就会被纪录到 /var/spool/cron/ 里面去 了,而且是以账号来作为判别的喔!举例来说, dmtsai 使用 crontab 后, 他的工作会被纪录到 /var/spool/cron/dmtsai 里头去!但请注意,不要使用 vi 直接编辑该文件, 因为可能由于输入语法错 误,会导致无法执行 cron 喔!另外, cron 执行的每一项工作都会被纪录到 /var/log/cron

crontab [-u username] [-l|-e|-r]

选项与参数:

-u :只有 root 才能进行这个任务,亦即帮其他使用者建立/移除 crontab 工作排程;
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
直接加文件就是覆盖当前用户的crontab文件
#分 时 日 月 周 |<=======指令串============>|

分钟 0-59 小时 0-23 日期 1-31 月份1-12  周 0-7(周的数字为 0 或 7 时,都代表『星期天』的意思) 指令 要执行的指令

  1. *(星号) 代表意义 代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * , 就代表着『不论何月、何 日的礼拜几的 12:00 都执行后续指令』的意思!
  2. ,(逗号) 代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是: 0 3,6 * * * command 时间参数还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!
  3. -(减号) 代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作: 20 8-12 * * * command 仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思!不能够设置为 23-7 不能通过crontab的检查
  4. /n(斜线) 那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则: */5 * * * * command 很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!

对于“-“和”/” 一起使用  是 * 前面的范围内的周期 内减去最开始的起始值 然后 取模 为0 才 执行 。如: 1-59/3 * * * *  cmd 就是 在 1-59 的范围内,与1的差能被3整除的时间,1,4,7......58

你只要编辑 /etc/crontab 这个文件就可以啦!有一点需要特别注意喔!那就是 crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个执行档,但是 /etc/crontab 可是一个『纯文本档』喔!你可以 root 的身份编辑 一下这个文件哩!基本上, cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,因此,只要你编辑完 /etc/crontab 这个文件,并且将他储存之后, 那么 cron 的设定就自动的会来执行了!

cat /etc/crontab
cat /etc/crontab SHELL=/bin/bash      <==使用哪种 shell 接口
PATH=/sbin:/bin:/usr/sbin:/usr/bin    <==执行文件搜寻路径
MAILTO=root                           <==若有额外 STDOUT,以 email 将数据送给谁
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | | 
# * * * * * user-name command to be executed
  1. MAILTO=root: 这个项目是说,当 /etc/crontab 这个文件中的例行性工作的指令发生错误时,或者是该工作的执行 结果有 STDOUT/STDERR 时,会将错误讯息或者是屏幕显示的讯息传给谁?默认当然是由系统 直接寄发一封 mail 给 root 啦!不过, 由于 root 并无法在客户端中以 POP3 之类的软件收信, 因此,鸟哥通常都将这个 e-mail 改成自己的账号,好让我随时了解系统的状况!例如:MAILTO=dmtsai@my.host.name
  2. PATH=….: 这里就是输入执 行文件的搜寻路径!使用默认的路径设定就已经很足够了!
  3. 分 时 日 月 周 身份 指令     七个字段的设定 这个 /etc/crontab 里面可以设定的基本语法与 crontab -e 不太相同喔!前面同样是分、时、日、月、 周五个字段, 但是在五个字段后面接的并不是指令,而是一个新的字段,那就是『执行后面那串指令的身份』为何!这与使用者的 crontab -e 不相同。由于使用者自己的 crontab 并不需要指定 身份,但 /etc/crontab 里面当然要指定身份啦!以上表的内容来说,系统默认的例行性工作是以 root 的身份来进行的

crond 服务读取配置文件的位置 一般来说,crond 预设有三个地方会有执行脚本配置文件,他们分别是:

  1. /etc/crontab
  2. /etc/cron.d/*

/var/spool/cron/* 这三个地方中,跟系统的运作比较有关系的两个配置文件是放在 /etc/crontab 文件内以及 /etc/cron.d/* 目录内的文件, 另外一个是跟用户自己的工作比较有关的配置文件,就是放在 /var/spool/cron/ 里面的文件群。 现在我们已经知道了 /var/spool/cron 以及 /etc/crontab 的内容,那现 在来瞧瞧 /etc/cron.d 里面的东西吧!

如果你想要自己开发新的软件,该软件要拥有自己的 crontab 定时指令时,就可以将『分、时、日、 月、周、身份、指令』的配置文件放置到 /etc/cron.d/ 目录下! 在此目录下的文件是『crontab 的配 置文件脚本』。

cat /etc/cron.d/0hourly 
# Run the hourly jobs 
SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root 
01 * * * * root run-parts /etc/cron.hourly

run-parts 脚本会在大约 5 分钟内随机选一个时间来执行 /etc/cron.hourly 目录内的所有执行文件!因 此,放在 /etc/cron.hourly/ 的文件,必须是能被直接执行的指令脚本, 而不是分、时、日、月、周 的设定值喔

  1. 个人化的行为使用『 crontab -e 』:如果你是依据个人需求来建立的例行工作排程,建议直接使用 crontab -e 来建立你的工作排程较佳! 这样也能保障你的指令行为不会被大家看到 (/etc/crontab 是大家都能读取的权 限喔!);
  2. 系统维护管理使用『 vim /etc/crontab 』:如果你这个例行工作排程是系统的重要工作,为了让自己管理方 便,同时容易追踪,建议直接写入 /etc/crontab 较佳!
  3. 自己开发软件使用『 vim /etc/cron.d/newfile 』:如果你是想要自己开发软件,那当然最好就是使用全新的配 置文件,并且放置于 /etc/cron.d/ 目录内即可。
  4. 固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置到 /etc/crontab 中来 集中管理较好。 如果想要偷懒,或者是一定要再某个周期内进行的任务,也可以放置到上面谈到的几个目 录中,直接写入指令即可!

有的时候,我们以系统的 cron 来进行例行性工作的建立时,要注意一些使用方面的特性。 举例来 说,如果我们有四个工作都是五分钟要进行一次的,那么是否这四个动作全部都在同一个时间点进行? 如果同时进行,该四个动作又很耗系统资源,如此一来,每五分钟的某个时刻不是会让系统忙得要死? 呵呵!此时好好的分配一些运行时间就 OK 啦!所以,注意一下:

  1. 资源分配不均的问题
  2. 取消不要的输出项目      另外一个困扰发生在『 当有执行成果或者是执行的项目中有输出的数据时,该数据将会 mail 给 MAILTO 设定的账号 』,好啦,那么当有一个排程一直出错(例如 DNS 的侦测系统当中,若 DNS 上层主机挂掉,那么你就会一直收到错误讯息!)怎么办?呵呵!还记得第十章谈到的数据流重导向 吧? 直接以『数据流重导向』将输出的结果输出到 /dev/null 这个垃圾桶当中就好了!
  3. 安全的检验    很多时候被植入木马都是以例行命令的方式植入的,所以可以藉由检查 /var/log/cron 的内容来视察 是否有『非您设定的 cron 被执行了?』这个时候就需要小心一点啰
  4. 周与日月不可同时并存   另一个需要注意的地方在于:『你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几 号且为星期几」的模式工作』。 这个意思是说,你不可以这样编写一个工作排程:
  5. 环境变量在crontab中没有效果
  6. %(百分号)在crontab中是一个特殊字符,相当于回车,如果在命令(command)字段中包含%,那么只有第一个百分号前的文本才会包含在实际命令中,之后的内容将作为标准输入赋值给前面的命令。
30 12 11 9 5 root echo "just test" <==这是错误的写法

本来你以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次, 或每年的 9 月 11 号分别进行,如此一来与你当初的规划就不一样了~所以啰,得要注意这个地方! Tips 根据某些人的说法,这个月日、周不可并存的问题已经在新版中被克服了~不过,鸟哥并没有实际去验证他!目前也不打算验证他! 因为,周就是周,月日就月日,单一执行点就单一执行点,无须 使用 crontab 去设定固定的日期啊!您说是吧?