我试图grunt watch
在我的用户登录我的 OS X 机器时运行,这样我就不必grunt watch
每次都手动在我的 $APP_ROOT 目录中运行。
我有以下org.grunt.watch.plist
文件/Library/LaunchAgents
:
<?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>org.grunt.watch</string>
<key>RunAtLoad</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/grunt-watch-launchd</string>
</array>
</dict>
</plist>
/usr/local/bin/grunt-watch-launchd
是我创建的一个 shell 脚本:
#!/bin/sh
APP_ROOT=/path/to/htdocs/app
/usr/local/bin/daemon -- /usr/local/bin/grunt watch --gruntfile="$APP_ROOT"/Gruntfile.js > /tmp/grunt-watch-launchd.log 2>&1
该脚本应使用daemon
实用程序(与 一起安装brew install daemon
)并“守护”该grunt watch
命令,该命令依次加载Gruntfile.js
配置并启动监视任务。
/usr/local/bin/grunt-watch-launchd
当我使用我的用户从 CLI手动运行时,一切正常。我看到一个daemon
with ps aux | grep grunt
which 运行grunt watch
命令。APP_ROOT
如果我随后watch
在Gruntfile.js
.
但关键是我希望当我用我的用户登录时launchd
自动启动。/usr/local/bin/grunt-watch-launchd
问题是当我运行时launchctl
:
launchctl load /Library/LaunchAgents/org.grunt.watch.plist
服务未加载。或者至少,launchd
调用脚本(因为我看到文件/tmp/grunt-watch-launchd.log
是创建的,所以脚本运行,虽然/tmp/grunt-watch-launchd.log
是空的),但守护进程似乎没有被创建或以某种方式被launchd
.
此外,里面什么也没有出现/var/log/system.log
。如果我尝试launchctl
使用 sudo 运行:
sudo launchctl unload /Library/LaunchAgents/org.grunt.watch.plist && sudo launchctl load /Library/LaunchAgents/org.grunt.watch.plist
/tmp/grunt-watch-launchd.log
将包含以下行:
daemon: fatal: refusing to execute unsafe program: /usr/local/bin/grunt (/usr/local/lib is group writable)
使用 sudo,/var/log/system.log
告诉我:
Jun 11 18:22:24 antons-mbp com.apple.xpc.launchd[1] (org.grunt.watch[83009]): Service exited with abnormal code: 1
无论哪种方式(launchctl
使用和不使用 sudo),我都可以确认该服务未启动:
mymachine:~ user$ launchctl list | grep grunt
- 0 org.grunt.watch
当我的用户登录时,有什么问题以及将这个脚本作为守护进程运行的正确方法是什么?
感谢您的关注。
编辑:我忘了说我使用的是 Mac OS X 10.12 Sierra,安装了 Gruntnpm
并且我使用的是 MacBook Pro(13 英寸,2012 年中)(如果有帮助的话)。
编辑2:我发现了问题。作为launchd
代理运行时,脚本无法找到命令,因为代理的用户不是我的用户。因此发生了 127 错误。
所以这适用于所有像我这样坚持使用非常简单的launchd
代理的人:
始终检查您使用的命令是否在启动该命令的用户的 PATH 中。使用绝对路径,如有必要,在脚本的第一行设置 PATH 变量。
将所有命令输出重定向到一个文件,以便您可以查看启动脚本时是否发生错误(在我的情况下,由于某种原因
launchd
错误没有出现)。/var/log/system.log