为什么这个 LaunchAgent plist 根本无法运行?

为什么这个 LaunchAgent plist 根本无法运行?

我有以下 plist 文件,即 ~/Library/LaunchAgents/wealthychef.obsidian-daily.plist。我想知道为什么它在加载后不执行。我觉得它应该按照书写的方式从 18:00 到 18:59 每分钟运行一次,如果计算机在这段时间处于睡眠状态,那么它应该在计算机唤醒时运行……但它没有。它根本不运行,即使我始终登录在机器上。有人能帮我理解我做错了什么吗?谢谢。

<?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>wealthychef.obsidian-daily</string>

    <key>Program</key>
    <string>/Users/rcook/bin/obsidian-daily.sh</string>

    <key>StandardErrorPath</key>
    <string>/Users/rcook/bin/log/obsidian-daily.err</string>

    <key>StandardOutPath</key>
    <string>/Users/rcook/bin/log/obsidian-daily.out</string>
    <key>StartCalendarInterval</key>
    <dict>
        <!--Missing arguments are considered wildcards-->
        <key>Hour</key>
        <integer>18</integer>
    </dict>
</dict>
</plist>

我已经验证并加载了它:

rcook: launchctl unload ~/Library/LaunchAgents/wealthychef.obsidian-daily.plist
rcook: launchctl load ~/Library/LaunchAgents/wealthychef.obsidian-daily.plist
rcook: plutil ~/Library/LaunchAgents/wealthychef.obsidian-daily.plist
/Users/rcook/Library/LaunchAgents/wealthychef.obsidian-daily.plist: OK

该脚本/Users/rcook/bin/obsidian-daily.sh存在且可执行,从终端启动时可按预期工作。以下是其内容。脚本中的命令从 cron 作业执行时工作正常,但如果 Mac 处于睡眠状态,则不会运行,因此我想使用 launchd,它应该在 Mac 唤醒时运行,但实际上没有运行。事实上,它根本不运行,无论是唤醒还是睡眠。我打开的古怪 URL 将由 Obsidian.md 应用程序启动。

#!//usr/bin/env bash
echo "It is running on $(date)" > ${HOME}/script-turd.txt
open 'obsidian://advanced-uri?vault=wealthyvault&daily=true&mode=prepend' 

答案1

launchd当 Mac 处于睡眠状态时不会运行作业。如果您使用 StartCalendarInterval,它将在 Mac 下次以正常的用户可见方式唤醒时运行它(也就是说,“暗唤醒”又称“电源小睡”唤醒不计算在内)。

如果在 StartCalendarInterval 到达时 Mac 处于关闭状态(而不仅仅是处于睡眠状态),则错过的实例将不会在下次启动时自动运行;它将被跳过,直到到达下一个 StartCalendarInterval。

请参阅“守护进程和服务编程指南 > 调度定时作业 > 睡眠和关机的影响

还要注意,LaunchAgents 只为当前登录的用户运行。我认为这只意味着 GUI 登录(WindowServer/LoginWindow 登录),而不是 SSH 登录。如果您未登录,即使 Mac 处于唤醒状态,您的 LaunchAgents 也不会运行。相比之下,即使没有用户登录(只要 Mac 处于唤醒状态),LaunchDaemons 也会运行,但 LaunchDaemons 被视为系统范围的,而不是每个用户的,因此它们不允许访问任何给定用户的环境/上下文/数据/文件。

答案2

找到解决方案

好的,感谢这里和苹果论坛上的朋友们,我找到了答案。我想把它放在这里供后人参考。这是一次令人沮丧的经历。

plist

这是一个有效的 LaunchAgent plist 和附带的 shell 脚本,它们完全符合我的要求,即在一天中的某个时间以我的用户名运行我的超棒的小 shell 脚本。

<?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>wealthychef.obsidian-daily</string>

    <key>ProgramArguments</key>
    <array>
    <string>/opt/local/bin/bash</string>
    <string>-c</string>
    <string>/Users/rcook/bin/obsidian-daily.sh</string>
    </array>
    
    <key>StartCalendarInterval</key>
    <dict>
        <!--Missing arguments are considered wildcards-->
        <key>Hour</key>
        <integer>20</integer>
        <key>Minute</key>
        <integer>14</integer>
    </dict>
    

</dict>
</plist>

shell 脚本

这是我正在使用的 shell 脚本。这个小文件出现在我的主目录中,Obsidian 对 URL 做了正确的处理。

#!/usr/bin/env bash

echo "It is running on $(date)" > /Users/rcook/script-turd.txt
open -a Obsidian 'obsidian://advanced-uri?vault=wealthyvault&daily=true&mode=prepend' 

结论

能让它正常工作真是令人欣慰。下一个测试是更改时间,使其在凌晨 5 点运行。根据上面 @Spiff 的评论,当我醒来时,我发现它在 05:00 运行,而使用 crontab 时,它时好时坏。

脚注:Lingon X 存在!

经过这一切,我意识到我的 Mac 上有一个名为 Lingon X 的程序,仔细查看后发现它似乎通过 GUI 制作了 LaunchAgents... 对此非常有用,并且可用于检查 LaunchAgents 的真实性。明智的做法。

相关内容