8.2 cron 工具(macOS 系统和 Unix 系统)
如你所见,Windows 系统中提供了任务计划程序,用来使脚本和其他可执行文件按计划自动定期运行。在 macOS 系统和 Unix 系统中,与之相似的程序称为 cron。
cron 程序依赖于 cron 表文件和 cron 任务来确定何时运行特定的可执行文件。cron 表文件是一个纯文本文件,你可以创建这个文件,在文件中列出所有想按计划自动运行的可执行文件,以及每个文件开始运行的具体时间。一个 cron 任务就是 cron 表文件中的一行,设定了一个要运行的可执行文件(例如:3parse_text_file.py)以及这个文件开始运行的时间(例如:每月运行)。
cron 表文件中的 cron 任务的具体语法一开始理解起来会有些困难。每行中的前 5 项设置了运行可执行文件的频率。这 5 项从左到右分别是:分钟(0~59)、小时(0~23)、天(1~31)、月(1~12)和星期几(0~6,星期天为 0)。每行中的最后一项设置了要按照设定频率运行的可执行文件。
有若干种方法可以设定前 5 项中的值。如果你想让可执行文件在某个项目的所有可能取值时都可以运行,那么就将这个项目设为一个星号(*)。例如,如果你想让文件每天都运行,那么就将第 3 个项目设为星号。相反,如果你想让文件在一个具体的时间运行,那么就应该将前两项设置为具体数值。例如,如果你想让文件在下午 3:10 开始运行,那么就应该将第一项设为 10,第二项设为 15(下午 3 时 =15 时)。
理解如何设置 cron 任务的最好方法是看几个例子,下面的例子给出了 cron 表文件中的 3 个 cron 任务:
10 15 * * * /Users/clinton/Desktop/analyze_orders.py 0 6,12,18 * * 1-5 /Users/clinton/Desktop/update_database.py 30 20 * * 6 /Users/clinton/Desktop/delete_temp_files.sh
第一行设置了 analyze_orders.py 应该在每月每日的下午 3:10 运行。第二行设置了 update_database.py 应该在每月的每个工作日(星期一至星期五)的早上 6:00、中午 12:00 和傍晚 6:00 各运行一次。第三行设置了 delete_temp_files.sh(一个 Bash 脚本)应该在每月的每个星期六的晚上 8:30 分运行。
这 3 个例子给出的是一些常用的 cron 任务设置。但是,你可能需要以一个特殊的频率运行脚本。例如,你可能需要在每月的第一个星期一运行脚本。在你已经确定了运行脚本的频率,但还不确定如何设置 cron 任务的时候,可以在互联网上搜索具体的语法(有人已经为你提供了解决方案)。例如,使用“cron job first Monday of month”进行一次快速搜索,就能够找到下面的语法形式,可以在每月的第一个星期一的上午 11:00 运行 Python 脚本 every_first_Monday.py:
00 11 1-7 * * [ "$(date '+\%a')" = "Mon" ] &&\ /Users/clinton/every_first_monday.py
8.2.1 cron表文件:一次性设置
我们已经从概念上理解了 cron 表文件和 cron 任务,下面就创建一个 cron 表文件,并设置一个 cron 任务,定期运行 Python 脚本 3parse_text_file.py。
cron 表文件的创建本质上是一种一次性设置。创建了 cron 表文件之后,就不再需要重新创建了。你可以在已有的 cron 表文件之中添加、修改或删除 cron 任务,来管理想定期自动运行的可执行文件。
要创建一个新的空 cron 表文件,打开终端窗口,输入以下命令:
touch crontab_file.txt
要想加载 cron 表文件(就是让操作系统加载 cron 表文件并按计划执行其中的命令),在命令行中输入以下命令,然后按回车键:
crontab crontab_file.txt
最后,从创建 crontab_file.txt 的位置删除它。要完成这个操作,在命令行中输入以下命令,然后按回车键:
rm crontab_file.txt
这样就完成了一个空的 cron 表文件的创建,一次性设置完成。图 8-10 中的屏幕截图展示了上面的 3 种一次性设置命令,还有用来编辑 cron 表文件的 crontab -e 命令。
图 8-10:图中的 3 条命令可以在命令行中使用,建立一个空的 cron 表文件。第四条命令 crontab -e 打开新建的 cron 表文件进行编辑
8.2.2 向cron表文件中添加cron任务
现在向 cron 表文件中添加一项 cron 任务。首先打开一个 cron 表文件进行编辑,输入以下命令,然后按回车键:
crontab -e
当你执行了 crontab -e 命令后,cron 表文件会在基于 Unix 的文本编辑器中打开,这样的文本编辑器包括 Nano、vi/Vim 或 Emacs。你可以在当前行中输入 cron 任务命令,用回车键将光标移到下一个空行,然后使用适当的关键字序列(下面会解释)来保存修改和退出文件。
有一种特殊情况,如果是用 vi/Vim 打开了文件,那么你使用的编辑器就有两种模式:命令模式和插入模式。文件刚打开时,编辑器处于命令模式,此时你输入的按键为作用在文件上的命令,而不是要输入文件中的文本。要想从命令模式切换到插入模式(插入模式允许你向文件中输入文本),需要输入命令 i。进入插入模式之后,你就可以在当前行中输入 cron 任务命令,用回车键将光标移到下一个空行,然后使用适当的关键字序列来保存修改和退出文件。
打开 cron 表文件,在当前行中输入以下命令,然后按回车键将光标移至下一个空行(参见图 8-11):
00 09 28-31 * * [ "$(date -v+1d '+\%d')" = "01" ] &&\ /Users/clinton/Desktop/3parse_text_file.py
图 8-11:输入 cron 表文件中的命令,在每月最后一天上午 9:00 运行脚本 3parse_text_file.py
这条命令与之前在 Windows 系统的任务计划程序中设置的参数是一致的,都是在每月最后一天的上午 9:00 运行脚本。命令左侧的 5 项表示这个任务应该在满足方括号中条件语句的前提下,在每月的 28、29、30、31 日中某一天的上午 9:00 运行。方括号中的语句检验的是,如果将当前日期加 1,那么所得的日期是否是 01(即下个月的第一天)。这条语句确保了脚本在每月的最后一天运行,不论这一天是 2 月 28 日、6 月 30 日还是 10 月 31 日。cron 程序会检查这些频率参数和语句,如果语句为真,cron 任务就会运行 3parse_text_file.py。每月最后一天的上午 9:00,都会运行这个脚本。
请注意光标(一个白色小长方形)在你输入的命令的下一个空行内。cron 表文件中可以有多个 cron 任务,每个任务占一行,但是你必须在最后一个 cron 任务后面按回车键,以使 cron 任务行结束,并使光标位于文件中的最后一个空行内。
既然你已经在 cron 表文件中输入了一个 cron 任务命令,现在就需要保存对文件的修改并退出文件了。根据你使用的编辑器,输入下列命令序列中的一个来保存修改并退出 cron 表文件:
· Nano:Ctrl+o,Ctrl+x
· vi/Vim:,w,q
· Emacs:Ctrl+x,Ctrl+s,Ctrl+x,Ctrl+c
保存了修改并且退出了 cron 表文件之后,查看一下 cron 表文件中的内容,看看保存在文件中的新建的 cron 任务。要查看 cron 表文件中的内容,输入以下命令,然后按回车键(参见图 8-12):
crontab -l
按下回车键之后,就可以看到 cron 表文件中的内容被打印到了屏幕上。如屏幕截图所示,cron 表文件中包含了我们的 cron 任务命令,在每月最后一天的上午 9:00 运行脚本 3parse_text_file.py。
图 8-12:在终端窗口中使用 crontab -l 显示 cron 表文件中的内容
要编辑或删除一个 cron 任务,先输入 crontal -e 打开 cron 表文件。如果你想编辑 cron 任务,对你想修改的位于某行的 cron 任务进行修改即可。如果你想删除 cron 任务,删除包含这个任务的行即可。对于以上两种情况,都要确认光标停留在文件中的最后一个空行内。然后,根据你使用的文本编辑器输入适当的按键序列,保存修改并退出 cron 表文件。
尽管你在日常工作中使用 Windows,但是知道如何计划 cron 任务也是非常重要的。因为有些时候,你可能会需要计划一个 cron 任务,所以知道如何在不同的操作系统下实现自动工作是非常有用处的。
本章篇幅比其他各章都短,但却是本书的一个重要补充,因为其内容可以使你定期自动运行所需脚本。其他各章教会了你扩展数据处理和分析能力的技术,本章则在规模化和自动化方面增强了这些技术。通过自动运行所需脚本,你可以减少忘记运行脚本的概率,并可以使用节省下来的时间去进行更重要的工作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论