crontab

事情的经过是这样子的,室友最近要做一个阿里的项目,大概就是利用软件工程结合机器学习对代码缺陷进行预测分析,现在正处于数据分析阶段,每天都会到github上拉一大堆项目,然后用写好的代码啪啪啪分析一通,一般来说代码都要跑很久,一般都是12小时左右才能出结果,而且等它跑完还要继续跑剩下一个项目,但是作为程序员,这样的体力活自然应该自动化处理啦,毕竟越厉害的程序员是越懒的。

所以,这种周期性,性质类似,但是需要大量重复劳动的工作可以写成自动化脚本再结合 crontab 来解决。crontab 就是为了周期性定时执行任务而生的,再也不用盯着电脑屏幕等结果跑完啦,感觉是现在搞AI的人的必备良药呢。

crontab 的语法还是挺简单的,但是咋一看还是一脸懵逼的,其实关于crontab 只要掌握一点就可以使用它了,就是关于时间语法的定义,因为 crontab 就是为了定时执行任务而存在的,所以它有自己的一套语法。

1
2
3
4
5
6
7
$ * * * * * command_to_execute
| | | | |
| | | | +- day of week (0 - 7) where sunday is 0 and 7
| | | +--- month (1 - 12)
| | +----- day (1 - 31)
| +------- hour (0 - 23)
+--------- minute (0 - 59)

我们要让某个任务在某个特定的时间点执行,时间无非就是哪个月的哪一天的几点几分或者是星期几该执行这项任务,在 crontab 的语法中我们先指定分钟,再次小时,接着一个月中的某一天,然后月份,最后星期几。具体的顺序如下:(min) (hour) (day_of_month) (month) (day_of_week)

例子

不过上面讲的还是太抽象了,我们来具体举几个例子来掌握crontab的使用吧。

例如我们已经写好了一个脚本,make_coffee.sh ,因为程序员都有午后喝咖啡的习惯,但是咖啡机每次启动都要预热好久,为了让自己少浪费一点时间,就写了一个脚本让咖啡机在每天下午两点自己开启进行预热,预热完成,我们就可以直接过去接咖啡了。所以,我们要让 crontab 每天下午执行这个脚本,我们应该怎么写呢,按照上面的语法,不是很难。

$ 0 14 * * * /path/to/make_coffee.sh

也就是说 crontab 每天下午两点会启动咖啡机预热,不过现在有个问题,我们周末并不在公司,只有工作日周一到周五在公司,所以,我们上面的语法还是有点问题的,应该让 crontab 指定在工作日才运行。

$ 0 14 * * 1-5 /path/to/make_coffee.sh

只要把第五个 * 换成 1-5 就可以啦,非常简单。

但是每天喝咖啡可能对身体不太好,那我们改成星期一星期三星期五喝咖啡,其他两天改喝牛奶,那我们应该怎么办呢,将1-5改成 1,3,5 就可以了。

$ 0 14 * * 1,3,5 /path/to/make_coffee.sh

crontab 的语法还是有很多的,这里就不一一例举了,我们有一个大致的思路,有了大致的思路,具体问题再去看文档就ok啦。

crontab管理

其实直接在命令行中直接数据 crontab 命令并不是一个非常好的习惯,我们最好将这些命令存放在文件中以便持久化的目的,也方便我们进行集中管理,很幸运的是,crontab 已经为我们提供了这些服务啦。

$ crontab -e

-e 可以让我们编辑crontab文件,可以在该文件中定义多个 crontab 任务。

$ crontab -l

-l 帮助我们查看当前用户定义的所有的 cron jobs

$ crontab -r

-r 则会清除当前用户所有的 cron jobs

Pieces of Valuable Programming Knowledges