你是否有过这样的需求,定时在机器上执行一些任务,比如跑数据,清理内容等等。 Crontab 就是做这个事情的标配。
这里的伙伴大多数做客户端开发的,可能对服务端相关的内容关注的相对少一些。 crontab 是这样一个工具,他能够根据你给出的配置在指定的时间执行任务。比如定期删除过期的日志文件(很多服务端环境,会生成大量的日志文件,在你不经意间就会把你的硬盘填满)。当然,它的应用不仅限于服务端,对于自己本地的电脑来说,也有它的用处。
crontab 是 Unix 系统的标配,几乎我们常见的大多数类 Unix 系统都自带 crontab, 包括 MacOS。 Crontab 名字的来源是 chronos - 一种极客们对时间的叫法。 关于它的更多内容,大家可以参考 Wikipedia 上面的描述: https://en.wikipedia.org/wiki/Cron 。
简单做了介绍之后,咱们来看看怎么使用。 大家可以在自己电脑的命令行中输入:
$ crontab -l
这个命令, 然后你应该会看到类似的输出:
crontab: no crontab for xxx
这个命令是用于列出你电脑上已有的计划任务,因为我们现在还没有指定任何计划任务,所以这个输出就像上面那样,告诉我们没有计划任务。 如果想添加自己的计划任务,可以输入这个命令:
$ crontab -e
这个命令会用 vi 打开一个命令行编辑器,你可以在这里编辑计划任务的描述。 crontab 描述文件中每一行代表一个任务,每一行的格式如下:
* * * * * rm /home/someuser/tmp/*
前面 5 个星号代表时间设置,从左到右每个星号的位置分别对应
分钟(0-59)
小时(0-23)
每月中的天(1-31)
每年中的月(1-12)
每周中的星期几(0-6) 0 代表星期日
每个星号的位置,可以是星号本身,也可以是具体的数字。 如果是星号本身,代表不加限制。 如果是数字,代表指定的时间。 举几个例子:
* * * * * // 5个都是个星号,代表每分钟都会执行。 30 * * * * // 每到 30分的时候执行一次,也就是每小时执行两次。 * 18 * * * // 每天的 18 点执行一次。 * */2 * * * // 每隔 2 小时执行一次, */ 是间隔时段的表示法。
以上是 crontab 时间设置个几个常用示例, 只要按照我们上述的每隔时间点的规则来使用,几乎可以满足我们绝大部分计划任务的需求。
在时间配置之后, 就是我们要执行的脚本文件,比如我们想在每天早上 8 点的时候清空机器上的临时文件,就可以这样配置:
* 8 * * * rm /home/someuser/tmp/*
每天 8点的时候,就会执行后面的 rm 命令, 删除临时文件夹中的文件。 后面的这个命令行内容,可以是任何的 Shell 命令,包括 pipe 操作,比如:
* 8 * * * rm /home/update.sh > /var/log/update.log
这个配置会在每天 8 点的时候, 执行一个叫做 update 的脚本, 并将日志输出流重定向到 update.log 文件中。 这时我们的命令行界面应该是这样的:
编辑完成后, 按下 Esc 键, 然后输入 :wq(代表保存并退出,这个是 vi 文本工具的使用方法), 在命令行左下角是下面图片中的状态的时候,按下回车键:
这样就保存了我们刚刚编辑的任务列表,我们再输出 crontab -l 命令,可以看到任务被成功添加了。
这样就 ok 了。剩下的事情就交给 crontab 来处理了。
crontab 是 Unix 系统中标配的计划任务工具,它的原理并不复杂,crontab 是一个守护进程,不停的检测它的任务列表是否符合执行条件,如果符合,就执行任务。这里跟大家聊的都是 crontab 比较常规的用法,更详细的文档,大家可以通过 man crontab 命令自行查看。相信它对大家的日常工作还是比较有帮助的。
如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~