用cron计划

我喜欢使用Homebrew在Mac上安装各种软件包和应用程序。 安装,升级和删除它们要容易得多。 另外,它与我的dotfile配置非常有效。

唯一的警告是,由于Homebrew不会删除旧版本的安装文件,因此您必须运行命令来定期清理它们。

前几天,仅通过运行以下两个命令,我就设法在Mac上恢复了近1GB的空间:

  $酿造清理 
$酿造桶清洁

这节省了大量的空间,而我要做的就是每个月左右运行一次这两个命令。

但是,如果我可以定期安排这些命令会更好,这样我就不必记住每个月都要运行它们。

介绍cron and crontab

cron是执行在crontab文件中找到的计划命令的守护程序。

创建一个crontab文件

通过运行以下命令可以查看是否有现有的crontab文件:

  crontab -l 

要创建crontab文件,只需运行:

  $ crontab -e 

这将启动您的默认编辑器(通常为vim )并打开crontab文件进行编辑。

  * * * * *回声“这将每分钟运行一次” 

设定时间和日期

让我们遍历每列表示的内容:

  • 分钟[0–59]
  • 小时[0–23]
  • 每月的某天[1-31]
  • 月[1–12]
  • 星期几[0-6](其中0代表星期日,6代表星期六)
  • 要执行的shell命令

添加*表示每一个,因此分钟列中的*表示每分钟运行此命令 如果要在上午8点安排一次命令,然后在下午8点安排一次命令,则可以在小时栏中输入8,20

这里有些例子:

  0 16 * * 0回显“每个星期天下午4点” 
  20 8 * * 1,5回显'每个星期一和星期五的8.20am' 
  0 0 31 12 *回声“ 12月31日午夜” 

警告 :您必须使用制表符,而不要在每个字段之间使用空格。

根据Apple的手册页,您可以在monthday of the week字段中使用月和日名称的前三个字母(例如montuejanfeb )代替使用数字。

您可以做的另一件事是用以下简写替换数据和时间字段:

  @reboot在启动时运行一次。 
  @yearly每年运行一次,“ 0 0 1 1 *”。 
  @每年(与@yearly相同) 
  @monthly每月运行一次,“ 0 0 1 * *”。 
  @weekly每周运行一次,“ 0 0 * * 0”。 
  @daily每天运行一次,“ 0 0 * * *”。 
  @midnight(与@daily相同) 
  @hourly每小时运行一次,“ 0 * * * *”。 

设置环境变量

cron具有自己的环境变量,其PATH设置为:

 路径= / usr / bin:/ bin 

这意味着,如果您尝试运行brew命令,则cron会抱怨找不到该命令。 因此,我们必须通过在crontab文件中指定PATH来更改它。

 路径= / usr / local / bin:/ usr / bin:/ bin 
  * * * * * Brew更新 

从单独的文件运行命令

实际上,我不仅要运行brew update ,还需要在单独的shell脚本中编写命令,然后将路径添加到脚本中。 现在, crontab文件如下所示:

 路径= / usr / local / bin:/ usr / bin:/ bin 
  * * * * * /path/to/your/shell/commands.sh 

要允许cron运行shell脚本,必须更改权限以使其可执行:

  chmod u + x /path/to/your/shell/commands.sh 

你有邮件

您可能已经注意到,由于cron是守护程序,您将无法在终端中看到它的运行情况。 那么我们如何知道cron作业是否已成功执行?

好吧,事实证明,每次计划程序运行时, cron都会向您发送一封电子邮件。 您可以通过终端中的mail命令访问以下消息:

  $邮件 

这列出了您收到的所有消息。 当然,如果您希望通过电子邮件将其发送到实际的电子邮件帐户,则可以将以下内容添加到您的crontab文件中:

  MAILTO =“ someone@somewhere.com” 

将crontab文件添加到您的dotfiles

如果可以将crontab文件集成到dotfiles ,那将是非常不错的dotfiles ,因此,当我运行脚本时,它们将添加一个crontab文件并为我安排它。

为此,我将创建两个文件:

  • cron.txtcrontab文件
  • cron.sh —要运行的命令

cron.txt添加到cron.txt文件中:

 路径= / usr / local / bin:/ usr / bin:/ bin 
  * * * * * /some/path/cron.sh 

cron.sh文件中,我具有要运行的所有shell命令:

  #!/ bin / bash 
 酿造更新 
酿造升级
冲泡清理
酿造桶清洁

接下来,我可以运行一个命令,用我刚刚创建的文件覆盖任何现有的crontab文件。 警告 :这将覆盖所有现有的crontab文件。

  $ crontab /some/path/cron.txt 

大! 因此,我现在要做的就是在dotfiles添加文本文件,并相应地修改dotfile脚本。

您可以在此处查看我的dotfiles GitHub存储库中的cron.txtcron.sh文件。