Total Pageviews

Saturday 27 October 2012

正确使用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
------------------------------------------------

权限引起的crond不装载配置

/etc/cron.d下的配置文件不被装载故障处理心得:
vixie-cron-4.1-76(crond)在 启动时 和 运行的过程中,会在整分钟(0秒的时刻)检查/etc/cron.d目录下的文件,假如权限、格式正确,则装载,并安排相应的任务。
假如某配置文件权限不对,那么则会跳过对该文件的检查,就是说即使将权限设置成正确的644,那么也不会被加载,需要手动reload配置:/etc/init.d/crond reload(或者再将文件改名——相当于加载新的权限正确的配置文件)。
而格式错误引起的配置无效,修改正确之后则不需要重新装载.