【问题标题】:Launchd runs with manual "launchctl start", but not on StartCalendarIntervalLaunchd 使用手动“launchctl start”运行,但不在 StartCalendarInterval 上运行
【发布时间】:2016-05-07 04:48:12
【问题描述】:

我有一个非常简单的启动守护程序,com.daily.vocab.plist,它只运行一个基本脚本。它应该在每天的某个时间运行(使用 StartCalendarInterval),但我无法做到这一点。网上很多帖子都说它会运行一两分钟,但对我来说它永远不会运行。

我在测试时将运行时间设置为未来 5 分钟,现在将其设置为在每分钟的第 0 秒运行,这样我才能让它工作。一旦它开始工作,我会将其设置为我想要的每日运行时间。

按照this tutorial 中的建议,它保存在 /Library/LaunchDaemons 中。我用launchctl load /Library/LaunchDaemons/com.daily.vocab.plist手动加载它。事实上,当我运行launchctl list 时,我确实看到它已加载。当我手动告诉它使用launchctl start com.daily.vocab 运行时,它会立即按预期工作。唯一的问题是 StartCalendarInterval 似乎被忽略了。我在我的 Macbook 上参加 Mavericks。

这是文件:com.daily.vocab.plist

<?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>Label</key>
      <string>com.daily.vocab</string>
    <key>Program</key>
      <string>/Users/MGS/developer/projects/vocab-sms/scripts/DEvocab.sh</string>
    <key>StartCalendarInterval</key>
      <dict>
        <key>Second</key>
            <integer>0</integer>
      </dict>
  </dict>
</plist>

理想情况下,我相信我希望它在每天早上 7:15 运行,从而改为使用 StartCalendarInterval 部分:

<key>StartCalendarInterval</key>
    <dict>
      <key>Hour</key>
        <integer>7</integer>
      <key>Minute</key>
        <integer>15</integer>
    </dict>

如果您甚至可以分享一个您必须使用 StartCalendarInterval 工作的 LaunchDaemon 示例以及您为使其工作而采取的每一步(例如运行 launchctl load x.x.x.plist),那将非常有帮助!

解决方案:这个本地守护进程实际上应该是一个用户代理,所以它需要保存在 ~/Library/LaunchAgents 目录中并从中加载。从那里,我还需要卸载代理并重新加载代理。

注意:在您卸载/加载之前,守护程序/代理不会在 launchd 中自动更新。您不能只保存更新的 .plist 并期望它工作!

【问题讨论】:

    标签: macos osx-mavericks launchd launch-daemon


    【解决方案1】:

    保存在/Library/... 中的已启动plist 是本地 域中的守护程序/代理,必须使用sudo 加载。如果没有sudo,您将在 user 域中加载与实际路径不匹配的守护程序。

    由于您无论如何都在 user 域中调用脚本,请将脚本保存在 ~/Library/LaunchAgents(它不是守护程序)中。 plist 语法应该是正确的。

    【讨论】:

    • 嗯。还是行不通。 com.daily.vocab.plist 文件现在保存在 ~/Library/LaunchAgents 中,我已将它(不带 sudo)加载到 launchd 中。 launchctl list 证实了这一点。但它仍然没有运行。我需要添加任何特殊权限吗?代理调用的shell脚本是否需要特殊权限?
    • 我只是将代理更改为使用 StartInterval 而不是 StartCalendarInterval 并且完全按预期工作。关于 StartCalendarInterval 为什么不起作用的任何想法?
    • 不,StartCalendarInterval 语法没有任何问题,也不需要进一步的权限。但是当然,通过设置分钟和小时,您必须等待 24 小时才能下次发生 ;-)
    • 好的,我想通了。自从从原始 /Library/LaunchDaemons 目录切换后,我没有卸载和重新加载代理。一旦我将它移到 ~/Library/LaunchAgents,然后卸载并重新加载 .plist,它就可以工作了。非常感谢@Vadian!
    • 我建议查看实用程序“启动控制”来创建和管理已启动的作业。使用 Launch Control 后,围绕正确目录以及是否加载作业的困惑会立即变得清晰。干杯! (不是我的,我只是喜欢它)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2019-11-15
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    相关资源
    最近更新 更多