# cron 和 at 调度作业
在 Linux 系统上,许多管理任务必须频繁地定期执行。
# cron 基本用法
- * * * * command to be executed
+ - - - -
| | | | |
| | | | +----- day of week (0 - 6) (Sunday=0)
| | | +------- month (1 - 12)
| | +--------- day of month (1 - 31)
| +----------- hour (0 - 23)
+------------- min (0 - 59)
* 通配表示每一分钟/小时/日月周等.*/n每n时刻. 23-7 23点到7点(范围). 1,3,5 表示多个指定时间
# 遇到问题
学了常用用法后,能帮助我们完成大多数任务,但是总会遇到不能解决的,最近注册了个ss账号,为了获得更多的流量,用python写了个签到脚本,22小时就能签到一次,为了最大限度减少时间,所以就要每22小时执行一次签到脚本。那么问题来了,如何实现?
00 */22 * * * python /home/script/checkin.py
根据基本用法,我们知道上面这句的意思 1天中每22小时的整点执行一次,实际测试下来,分别是0:00 和22:00分别执行一次,所以明显不是我们想要的。
放狗搜吧!找到了个类似的:每个90分钟(一个半小时)执行一次命令/脚本
0 0,3,6,9,12,15,18,21 * * * command
30 1,4,7,10,13,16,19,22 * * * command
他这里把拆分成两条来执行。再回来我们这里我们拆分起来就非常麻烦,22:00->20:00->18:00->....这条路看来是行不通了。
难道除了写程序,就没办法了?
对了,还有at的嘛,我们来看看它的基本用法 。
# at
at(选项) (参数)
选项中我们常用的是 -f是任务文件,其他的可以自行查看。
参数一般格式为time + count time-units, 支持的时间包括:
- 13:00
- 1:00PM+1 days
- 5:30AM Monday
- now+10 minutes/hours/days/weeks/months/years
- 4:00 tomorrow/today
- midnight/noon/teatime(4pm) DD.MM.YYYY / DD.MM.YY / MM/DD/YYYY / MM/DD/YY / MMDDYYYY or MMDDY
来我们示例下:
at now +1 minutes -f /home/script.sh
1分钟后如果我们再执行一次,就行了,所以类似递归程序,不断执行下去。
Okay,写个脚本测试下。
vi5i0n@kali ~ $ cat admin.sh
#!/bin/bash
echo `date`>> /tmp/test.log
at now +1 minutes -f /home/vi5i0n/admin.sh
执行 at now +1 minutes -f /home/vi5i0n/admin.sh 后,一分钟后可以看到新的任务已经更新。
vi5i0n@kali ~ $ atq
4 Mon Mar 28 21:45:00 2016 a vi5i0n
vi5i0n@kali ~ $
vi5i0n@kali ~ $ atq
5 Mon Mar 28 21:46:00 2016 a vi5i0n
查看日志,也是成功执行的。
vi5i0n@kali /var/log $ tail -f /tmp/test.log
Mon Mar 28 21:44:00 CST 2016
Mon Mar 28 21:45:00 CST 2016
Mon Mar 28 21:46:00 CST 2016
所以我们解决方案就出来了。
#!/bin/bash
ptyhon /home/script/checkin.py
at now +22 hours -f /home/22_cron.sh
这样子我们就能解决每xx小时/天执行一次命令了。
其实我之前考虑用crontab来更新crontab,但是at更简单。这里在sh脚本里可以写个函数来检测新的at是否成功。
对了,crontab还有个小技巧。
特殊符号 意义
@reboot 重启时运行一次
@yearly 每年运行一次,相当于: "0 0 1 1 *".
@annually 跟@yearly意思一样
@monthly 每月运行一次, 相当于: "0 0 1 * *".
@weekly 每周运行一次,相当于 "0 0 * * 0".
@daily 每天运行一次, 相当于"0 0 * * *".
@midnight 跟@daily的意思一样
@hourly 每小时运行一次, 相当于"0 * * * *".
这里@reboot这个还是很实用的。
# 总结
多思考,多放狗搜索!