名校课程推荐 | MIT《CS 实用工具课程》-自动化
自动化
有时候你为某个任务写了一个脚本,但是你希望它能定期运行,比如备份任务。你可以写一个临时的解决方案,在后台运行并定期上线。不过,大多数UNIX系统都有cron后台常驻程序,它会根据简单的规则每分钟定期执行任务。
在大多数UNIX系统的cron后台常驻程序中,默认crond
会一直运行,你可以用ps aux | grep crond
命令进行检查。
Crontab命令
可通过crontab -l
展示cron的配置文件,运行crontab -e
命令进行编辑。cron使用的时间格式是5个空格隔开的字段,加上用户和命令。
分:一个小时中在什么时分执行命令,取值范围在0到59之间
时:在几点执行命令,指定24小时制,取值范围在0-23之间(0是零点)
日:一个月中几号执行命令,比如,要在每个月19号执行命令。设置"日"为19
月:在几月执行命令,可以用数字指定(0-12),也可以用月份名称指定(比如5月)
周:星期几执行命令,可以用数字指定(0-7),也可以用星期几(比如星期日)
用户:执行命令的用户名
命令:你想要执行的命令,此字段可能包含多个单词或者空格。
注意,星号*
表示所有,星号后加斜杠/+数字表示每n值。这里的`/5`表示每5分钟。看以下例子:
*/5 * * * * # Every five minutes
0 * * * * # Every hour at o'clock
0 9 * * * # Every day at 9:00 am
0 9-17 * * * # Every hour between 9:00am and 5:00pm
0 0 * * 5 # Every Friday at 12:00 am
0 0 1 */2 * # Every other month, the first day, 12:00am
你可以在 crontab.guru中找到更多常见的crontab时间写法
Shell环境和登录
在使用cron时容易犯一个错误,它不会加载与常用shell(比如.bashrc
、.zshrc
等)相同的环境脚本,并且默认情况下,它不会将输出记录到任何地方,加上最大频率为1分钟,最初调试conscripts会非常痛苦。
环境方面,请确保在所有脚本中使用绝对路径,并修改PATH
等环境变量,这样脚本能顺利运行。为了简化日志记录,一个很好的建议是用这样的格式写crontab
* * * * * user /path/to/cronscripts/every_minute.sh >> /tmp/cron_every_minute.log 2>&1
并在一个单独的文件中编写脚本。请记住,>>
表示附加到文件,而2>&1
将stderr
重定向到stdout
(虽然你可能希望将它们分开)。
Anacron
使用cron时需要注意的一点是,如果计算机在应该运行cron脚本时处于关机或者休眠状态,它就不会被执行。对于频繁执行的任务来说,这可能没什么问题,但如果执行任务的频率较低,你需要确保它被执行。anacron的工作方式与cron
类似,只是它的频率是以天为单位指定的。与cron不同,它不是假设机器是持续运行的。因此,它可以在非24小时运行的设备上使用,会以1天、一周、一个月作为检测周期,判断是否有定时任务在关机后没有执行。。
练习
生成一个脚本,每分钟查看下载文件夹中的图片文件(你可以查看MIME类型或使用正则表达式来匹配常见的扩展名),并将它们移动到Pictures文件夹中。
编写一个cron脚本,用于每周检查系统中过时的包,并提示你更新它们或自动更新。