Posts Tagged: crontab


17
十二 10

正确使用cron

/etc/cron.hourly、/etc/cron.daily 、/etc/cron.weekly、/etc/cron.monthly 目录下的脚本,是顺序执行的(在/etc/crontab中由 run-parts 命令启动)。所以,假如你有脚本需要延时(随机的时间)运行,放在这里是很不合适的,会影响到其他脚本的在“预料的时间”正确运行。

这个,看一下 run-parts 就知道:

# Ignore *~ and *, scripts
for i in $1/*[^~,] ; do
[ -d $i ] && continue
# Don’t run *.{rpmsave,rpmorig,rpmnew,swp} scripts
[ "${i%.rpmsave}" != "${i}" ] && continue
[ "${i%.rpmorig}" != "${i}" ] && continue
[ "${i%.rpmnew}" != "${i}" ] && continue
[ "${i%.swp}" != "${i}" ] && continue
[ "${i%,v}" != "${i}" ] && continue

if [ -x $i ]; then
$i 2>&1 | awk -v “progname=$i” \
‘progname {
print progname “:\n”
progname=”";
}
{ print; }’
fi
done

怎么办呢?

给任务脚本增加个参数,自已调用自己,放到后台,然后立即退出。

在任务脚本开始增加如下几行(注意 nohup 以及 &>/dev/null 的使用,使用不当,仍然会在此处sleep()等待。最好自己测试一下:run-part /etc/cron.daily ):

if [ x"$1" = 'x' ];then
nohup $0 background &>/dev/null &
exit 0
fi

——————————————————-

又遇到一个新问题:关于/etc/cron.d的。之前写过一篇,因为权限原因引起的cron.d目录下的配置不被加载,这次又遇到了一个新问题。cron.d下的文件内容格式不正确,也会引起不加载:

file hdmon.crontab.5_00
hdmon.crontab.5_00: character Computer Graphics Metafile

查看文件内容,丝毫发现不了问题。

还有另一个需要注意的地方:

据说跟版本有关系,所以使用的时候最好自己试一下。/etc/cron.d下的文件,被crond加载以后,假如内容变化,RHEL4上的crond不会重新加载,而RHEL5上的则会。所以,想要通过程序控制/etc/cron.d下的文件,需要通过 crond 重新加载配置,或者,每次都使用不同的文件名。

——————————————————–
另外一个问题:

在 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly里的脚本运行和放在crontab配置里运行的脚本,是有一定的不同的。

要注意两个点:
1. “%”号的特殊意思
2. PATH变量。很多异常都是因为PATH变量引起的。调试的时候,手动执行一点儿问题没有,放到crontab中执行,就出错,绝大多数都是因为PATH的问题。好像默认情况下,cron将PATH初始化成PATH=/bin:/usr/bin.


29
十 09

权限引起的crond不装载配置

/etc/cron.d下的配置文件不被装载故障处理心得:

vixie-cron-4.1-76(crond)在 启动时 和 运行的过程中,会在整分钟(0秒的时刻)检查/etc/cron.d目录下的文件,假如权限、格式正确,则装载,并安排相应的任务。

假如某配置文件权限不对,那么则会跳过对该文件的检查,就是说即使将权限设置成正确的644,那么也不会被加载,需要手动reload配置:/etc/init.d/crond reload(或者再将文件改名——相当于加载新的权限正确的配置文件)。

而格式错误引起的配置无效,修改正确之后则不需要重新装载!

 


11
三 09

细读crontab手册

一句话总结crontab(指这个应用、这个机制)的作用:”run this command at this time on this day”,在指定的日期、时间,运行指定的命令。下面是Linux 上crontab手册中的知识点,小结如下:

1. crontab文件“正式行”的开始

空行、以空格或者“tab”开行的行,被cron(daemon)忽略。

以#开始的行,作为注释被cron(daemon)忽略。

“注释”不允许与“命令”放在同一行(作为命令的注释),会被作为“第六段”,被cron(daemon)执行。

同样的,也不能放在设置环境变量的同一行。

2. 在crontab文件中指定环境变量

设置变量使用

name = value

这样的格式,”=”号左右的空格不是必须的。

几个变量默认已经被设置,比如:

SHELL=/bin/sh
HOEM=/home/nnix
LOGNAME=nnix

其中SHELL和HOME可以重新设定,LOGNAME则不可(大概跟确定crontab文件的位置有关)。

默认,crontab会把执行的输出发送给crontab的所有者,除非重新设定变量:

MAILTO=other_or_email

另外,当crontab发送输入时的邮件编码,可以通过设置变量 CONTENT_TYPE 和 CONTENT_TRANSFER_ENCODING 来使用正确的编码来发送邮件。

3. crontab 文件的分段

依次分别是

  • 分(0-59)
  • 时(0-23)
  • 日(1-31)
  • 月(1-23,或者英文名)
  • 周(0-7,或者英文名,0和7均表示周日)
  • 要执行的内容   

4. 前五段:时间和日期

1)表示任意:* 号表示 “任意”(first-last)。

2)指定数字,表示指定的时间。

3)指定段,表示“开始-结束”内包含的数:比如3-6,表示3,4,5,6

4)指定列表:比如 “1,2,3,4″,”0-4,8-12″

5)指定“步长”:8-14/2 表示8,10,12,14

5. 模糊的第六段:

1)除去前五段,从第六段开始到换行符或者“%”为止,为要执行的命令。

2)默认第六段将被/bin/sh执行,除非在crontab文件中指定了非/bin/sh的SHELL变量。

3)第六段中的”%”号,除非前面加”\”号转交,否则,“%”号将结束命令行、换行的意义,并且其后的内容会被做为标准输入发送给前面的命令。

6. 冲突的逻辑

日期可以用月限定,也可以用“星期”指定,如果两个段有冲突(比如这两段不同时为“*”),那么,第六段的命令将在匹配任何一个的情况下运行,比如

“30 4 1,15 * 5″,将在每月的1号和15号 加 每个周五,上午4:30运行。

7. crontab文件中的神密符号“%”

可能会遇到的一个问题是,在第六段中需要使用date生成日志文件名,比如:

0   4   *   *   *   /opt/cron/mysql_dump.sh    > /srv/logs/`date +%y-%m-%d`.dump.log

这时会发现crontab怎么也不运行这个mysql_dump.sh,也看不到有日志生成。这是因为在crontab文件中,”%”是有特殊含义的。假如不需要“%”的特殊作用,需要使用转义符转义。上面应该写成:

0   4   *   *   *   /opt/cron/mysql_dump.sh    > /srv/logs/`date +\%y-\%m-\%d`.dump.log

“%”在crontab文件中,有“结束命令行”、“换行”、“重定向”的作用,比如:

0  22  * * 1-5  mail -s “It’s 10:00 pm” joe%Joe,%%Where are your kids?%

将会在周一至周五的22:00发送一分内容为:

Joe,<换行>
<换行>
Where are your kids?<换行>

8. 不能理解的特殊用法

       @reboot    :    Run once, at startup.

为了达到在开机后运行,且只运行一次的目的,除了这个,恐怕无法通过前五段的设置来实现吧?


24
二 08

crontab

第一道第五个字段的整数取值范围及意义是:

0~59 表示分

1~23 表示小时

1~31 表示日

1~12 表示月份

0~6 表示星期(其中0表示星期日)

/etc/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在,而有另外一个文件/etc/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时cron.allow优先,如果都不存在,只有超级用户可以安排作业。

注:cron.allow和cron.deny的位置可能不尽相同。