定时计划任务高级玩法

# 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分钟执行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这个还是很实用的。

# 总结

多思考,多放狗搜索!

# 参考地址:

  1. http://platinhom.github.io/2015/07/30/at-cron-plan/
  2. http://www.dabu.info/crontab-set-90-min-run-command.html
  3. http://www.zhetenger.com/cron高级使用教程

--EOF--


>看不到评论?GFW!!!