周末晚上需要暂停一个用cron定期运行来监控SSH Tunnel连通性的脚本。但是无论我把脚本去掉执行权限,还是把脚本改名,最后把Crontab里面的任务删除掉,我的邮箱还是每隔10分钟就收到一封报警邮件,仿佛是一个藏在暗处的幽灵在捉弄我,我都快要抓狂了。
后来用ps发现有好几个脚本进程在运行,把这些进程一一杀死后邮箱才安静了。我分析是脚本运行的(超时)时间太长,在10分钟内没有结束,导致不断积压监控脚本的进程。尽管已经停止了cron任务,但是这些进程还在,它们超时结束的时间间隔也会是10分钟,所以还会以10分钟的间隔发出邮件,让我看起来似乎是cron任务还在运行。
搜了一下类似的情况也有发生,可以用GNU的timeout命令来解决。
2012年8月20日星期一
2012年6月29日星期五
Cron任务没有执行
Web方式显示服务器历史负载的图中,有几天的内容是空的。昨天我从头看代码。回家后想想既然平常能正常显示,那么程序应该不会有问题,应该直接从问题入手,先查询数据库。
今天把程序在IPython里面import了调试,发现那几天的负载数据库表不存在。往这个数据库写数据的程序是个cron任务,在syslog里面没有找到任务执行记录,在root的邮件里面也没有看到任务执行出错的邮件。然后在cron(8)手册里面,发现/etc/cron.d里面的任务名字不能带点,而入库的任务名字叫checknagios.cron。
另外,某人同时用 /usr/share/doc/cron/examples/cron-tasks-review.sh检查,出现提示:
貌似复杂的问题,竟然源于一个点。把任务文件名中的"."去掉就解决了。
今天把程序在IPython里面import了调试,发现那几天的负载数据库表不存在。往这个数据库写数据的程序是个cron任务,在syslog里面没有找到任务执行记录,在root的邮件里面也没有看到任务执行出错的邮件。然后在cron(8)手册里面,发现/etc/cron.d里面的任务名字不能带点,而入库的任务名字叫checknagios.cron。
另外,某人同时用 /usr/share/doc/cron/examples/cron-tasks-review.sh检查,出现提示:
更加确认了这一点。WARN: The file /etc/cron.d/checknagios.cron will not be executed by cron: Does not conform to the run-parts convention
貌似复杂的问题,竟然源于一个点。把任务文件名中的"."去掉就解决了。
2010年11月2日星期二
Cron和Anacron
今天查看Ubuntu下系统的cron任务是如何执行的,发现了很纠结的事情。
系统的cron文件/etc/crontab的相关内容是这样的:
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
第一行确保了/etc/cron.hourly中的任务可以运行,但是这个目录是空的,没任务。下面三行是说,如果/usr/sbin/anacron不能执行,才执行/ect/cron.daily、/etc/cron.weekly和/etc/cron.monthly里面的任务。但是anancron是装上的,所以后面三行中的任务是没法执行的。
然后摸索了下,看看anacron是个什么东东。它的系统任务是/etc/anacrontab,这个文件的内容如下:
1 5 cron.daily nice run-parts --report /etc/cron.daily
7 10 cron.weekly nice run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly
看到这里才明白了,原来是通过anacron来运行cron的任务。就是说实际的任务脚本在cron的相关目录里面,而调用是要通过anacron的。难怪我要说纠结呢。
anacron的手册里面也指出了anacron的这种用法:
Anacron can be used to execute commands periodically, with a
frequency specified in days. Unlike cron(8), it does not assume that
the machine is running continuously. Hence, <b>it can be used on
machines that aren't running 24 hours a day, to control daily, weekly,
and monthly jobs that are usually controlled by cron.</b>
可以看出anacron是辅助cron任务更好地得以执行的。把anacron删除了这些任务还是可以运行,但是必须在指定的时间开机才行,而不是anacron那样能够"补上"漏掉的任务。
系统的cron文件/etc/crontab的相关内容是这样的:
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
第一行确保了/etc/cron.hourly中的任务可以运行,但是这个目录是空的,没任务。下面三行是说,如果/usr/sbin/anacron不能执行,才执行/ect/cron.daily、/etc/cron.weekly和/etc/cron.monthly里面的任务。但是anancron是装上的,所以后面三行中的任务是没法执行的。
然后摸索了下,看看anacron是个什么东东。它的系统任务是/etc/anacrontab,这个文件的内容如下:
1 5 cron.daily nice run-parts --report /etc/cron.daily
7 10 cron.weekly nice run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly
看到这里才明白了,原来是通过anacron来运行cron的任务。就是说实际的任务脚本在cron的相关目录里面,而调用是要通过anacron的。难怪我要说纠结呢。
anacron的手册里面也指出了anacron的这种用法:
Anacron can be used to execute commands periodically, with a
frequency specified in days. Unlike cron(8), it does not assume that
the machine is running continuously. Hence, <b>it can be used on
machines that aren't running 24 hours a day, to control daily, weekly,
and monthly jobs that are usually controlled by cron.</b>
可以看出anacron是辅助cron任务更好地得以执行的。把anacron删除了这些任务还是可以运行,但是必须在指定的时间开机才行,而不是anacron那样能够"补上"漏掉的任务。
订阅:
博文 (Atom)