如何在Mac OS上用Cron更新自制软件

时间:2013-12-11 19:31:10

标签: linux macos bash cron crontab

我一直在摒弃一些持久的Linux技术来帮助我实现日常工作的自动化。我发现cron非常强大,如果我可以用它来检查我系统上的一些软件包的更新。

例如,我想每天晚上11点更新我的Homebrew。我做的是sudo crontab -u user -e,我在Vim中打开了crontab。我将以下命令放入其中,为homebrew进行更新并向我发送电子邮件。

以下是代码:

MAILTO=myemail@foo.com
* 23 * * * brew update

我保存它等待魔法发生。在收到的电子邮件中,它没有排除此命令,而是显示/bin/sh: brew : command not found

但是当我在终端输入/bin/sh以打开sh并输入brew update时,它会更新Homebrew

我的crontab配置出了什么问题?

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:19)

Cron没有定义PATH,请确保始终使用完整路径调用命令,这可能是/usr/local/bin/brew update

这被认为是防止意外/意外命令运行的良好做法。如果有人在你的路径中的某个地方放置一个名为'brew'的恶意脚本,但在/ usr / local / bin之前,它会被调用。

答案 1 :(得分:6)

我有同样的想法,而cronjob是一个不错的选择。但是,我发现了一个脚本,如果Mac上安装了新版本的公式,它将通知您。我不希望它自动发生。

http://chrisstreeter.com/archive/2012/08/homebrew-package-update-notifications-on-mountain-lion.html

我将脚本扩展为不在通知程序中显示固定公式:https://gist.github.com/SimonSimCity/13832e2e03597a6be793

在编写cron作业时,我决定选择一个launchd-agent,因为如果以后启动Mac,这也会运行。如果你的mac当时已经打开,那么Cron-jobs就会运行。

对于cronjob vs launchd的一些帮助,我建议阅读本文或类似的介绍:http://alvinalexander.com/mac-os-x/mac-osx-startup-crontab-launchd-jobs

这是我的配置。正如您所见,它每天上午10点和下午3点运行。由代理调用的脚本位于/usr/local/bin/homebrew-update-notifier

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>EnableGlobbing</key>
    <false/>
    <key>Label</key>
    <string>homebrew.simonsimcity.update-notifier</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/usr/local/bin/homebrew-update-notifier</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/tmp/homebrew.simonsimcity.update-notifier.err</string>
    <key>StandardOutPath</key>
    <string>/tmp/homebrew.simonsimcity.update-notifier.out</string>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>10</integer>
            <key>Minute</key>
            <integer>0</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>15</integer>
            <key>Minute</key>
            <integer>0</integer>
        </dict>
    </array>
</dict>
</plist>

恭喜!现在,如果有新的更新,您将收到通知。如果您觉得过时,只需致电brew upgrade,或者也可以将其包含在脚本中;)

答案 2 :(得分:0)

您的bash配置可能有问题。请务必设置PATH,使其包含brew所在的目录。您可以在~/.profile中设置该目录,但要确保它也设置在~/.bashrc中。或者,您可以按照设置crontab

的相同方式在MAILTO中进行设置

答案 3 :(得分:0)

我个人的处理方式是:

  • 下载CronniX(已终止,但仍然可以运行,例如brew cask install cronnix

  • 通过/usr/local/bin/brew update将用户界面中的作业设置为每小时运行一次。

让它在后台打勾!

enter image description here