at定时任务的一些tips

linux下面有一个at命令用于执行一次性的定时任务,使用方法很简单。
类似下面这些命令:
#at 2012-12-12
at> ifconfig
at> <EOT>
job 16 at 2012-12-12 13:24
之前有一些工作就是利用at去完成了,但是最近遇到一个问题,需要对之前利用at去执行的命令做一些搜索统计操作,包括at命令执行时间,执行内容等等。
man at 命令可以得知:
1、atq命令(或者at -l)  可以查看目前系统中的队列列表。
#atq
16      2012-12-12 13:24 a root
13      2013-01-02 00:00 a root
12      2013-01-01 00:00 a root
14      2013-01-01 00:01 a root
15      2013-01-01 00:10 a root
2、at -c {jobnumber}   查看具体执行的命令内容。
at -c 16
3、at的所有命令文件都存放在 /var/spoll/at下面
文件名类似
a0000c01591860
文件内容其实就是 at -c 显示出来的内容

最重要的还是at任务和at文件的关系,at命令文件的文件名代表什么含义?
经过一番研究猜测,终于搞定
文件名的格式如下:
第一位表示 at队列号,也就是atq显示出来第四列的内容。linux的at说明上显示只能用a-z,经过测试其实+ ,(等特殊符号也是可以的,修改文件名就行
第二-第五位 表示at的任务号,也就是atq显示出来的第一列内容,16进制。
第六-最后   表示at命令的执行时间,精确到分钟数,16进制,这个数字其实就是相对于linux初始时间1970-1-1 12:00的分钟数。
比如01591860
python转换下:
import datetime
m=datetime.datetime(1970,1,1,12,0)+datetime.timedelta(days=int(0x01591860)/(60*24))
>>> m
datetime.datetime(2012, 12, 31, 12, 0)
至此一开始我的任务就很好搞定了,只要对at文件进行一些内容查找,然后分析文件名,就能得到所要的信息。
其实也可以直接用shell来比如:
atq|awk '{print $1}'|xargs at -c|grep  要查找的命令
不过那样文件比较多的时候就会比较慢,而且会有一些错误,比如
Cannot open a0003c0153a24f: Too many open files

同时还有几个附加结论:
1、linux支持的最大at任务数应该是 五位16进制
2、可以通过修改at文件名来设定一些已经过去的计划任务
3、at定时任务的最大时间应该是a00001FFFFFFFF,显示为10136-02-16 12:15
4、一个bug,/var/spoll/at下面有a00001FFFFFFFF名的文件时,at命令便不能再生成了,很有意思。
5、要从一台机器上面copy at任务到另外一台机器上面,只要复制at文件就行了,不过前提是环境变量相同。

猜你喜欢

转载自dingody.iteye.com/blog/1970836