名校课程推荐 | 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>&1stderr重定向到stdout(虽然你可能希望将它们分开)。

Anacron

使用cron时需要注意的一点是,如果计算机在应该运行cron脚本时处于关机或者休眠状态,它就不会被执行。对于频繁执行的任务来说,这可能没什么问题,但如果执行任务的频率较低,你需要确保它被执行。anacron的工作方式与cron类似,只是它的频率是以天为单位指定的。与cron不同,它不是假设机器是持续运行的。因此,它可以在非24小时运行的设备上使用,会以1天、一周、一个月作为检测周期,判断是否有定时任务在关机后没有执行。。

练习

  1. 生成一个脚本,每分钟查看下载文件夹中的图片文件(你可以查看MIME类型或使用正则表达式来匹配常见的扩展名),并将它们移动到Pictures文件夹中。

  2. 编写一个cron脚本,用于每周检查系统中过时的包,并提示你更新它们或自动更新。

客服