我有以下 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 的真实性。明智的做法。