我创建了一个脚本来更新我的包管理器并通过终端通知程序发布通知。手动运行时,它工作正常,但通过 launchd(用户本地,在 ~/Library/LaunchAgents/ 中)调用时,终端通知程序似乎没有启动。但是,它没有挂起;脚本的后面部分按预期运行。stdout/stderr 上没有生成任何内容。我在所有操作中都使用绝对路径,因此就手动执行和 launchd 执行而言,这也不是问题。我相当肯定这只是 launchd 的另一个愚蠢的怪癖,但有什么办法可以克服它吗?
启动代理
<?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.brew.autobrew</string>
<key>ProgramArguments</key>
<array>
<string>/Users/[USERNAME]/.scripts/autobrew.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key><integer>0</integer>
<key>Hour</key><integer>22</integer>
</dict>
<key>AbandonProcessGroup</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/autobrew_launchd.log</string>
<key>StandardErrorPath</key>
<string>/dev/autobrew_launchd.log</string>
</dict>
</plist>
autobrew.sh中相关代码行
/usr/local/bin/terminal-notifier -title "Homebrew updates" -sound default
答案1
我遇到了同样的问题,也不知道该怎么做。最后我终于想起终端通知程序README.markdown
那:
为了使用终端通知程序,您必须调用应用程序包内的二进制文件。
因此,我编辑了脚本,/Applications/terminal-notifier.app/Contents/MacOS/terminal-notifier
改为调用/usr/local/bin/terminal-notifier
,这样就解决了问题。虽然/usr/local/bin/
从交互式 shell 调用脚本时可执行文件可以正常工作,但出于某种原因,launchd
需要使用封装在里面的版本/Applications/terminal-notifier.app
才能正常工作。
(请注意,如果您terminal-notifier
使用 Homebrew 安装,则必须确保按照运行brew linkapps
在应用程序文件夹中创建必要的符号链接brew info terminal-notifier
。)