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文件就行了,不過前提是環境變量相同。