我試圖在我的用戶登錄到我的OS X機器時運行grunt watch
,這樣我就不必每次都手動在我的$ APP_ROOT目錄中運行grunt watch
。如何使用launchd .plist文件守護使用grunt watch命令?
我有內/Library/LaunchAgents
以下org.grunt.watch.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>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
配置並啓動監視任務。
當我用CLI手動運行/usr/local/bin/grunt-watch-launchd
與我的用戶,一切都很好。我看到一個daemon
與ps aux | grep grunt
運行grunt watch
命令。如果我編輯APP_ROOT
中的文件,Grunt的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
內沒有任何內容。如果我嘗試使用sudo運行launchctl
:
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),我可以確認該服務不是開始d:
mymachine:~ user$ launchctl list | grep grunt
- 0 org.grunt.watch
什麼是錯誤以及當我的用戶登錄時將此腳本作爲守護程序運行的正確方法是什麼?
感謝您的關注。
編輯: 我忘了說我使用Mac OS X 10.12 Sierra,安裝了Grunt npm
,我正在使用MacBook Pro(13英寸,2012年中)(如果這可能有所幫助)。
編輯2: 我發現了這個問題。作爲launchd
代理運行時,腳本無法找到命令,因爲代理的用戶不是我的用戶。因此發生了127錯誤。
因此,這是對像我這樣所有的人是停留在一個非常簡單的launchd
劑:
請務必確認您使用的命令是誰啓動命令的用戶的路徑。使用絕對路徑,如有必要,在腳本的第一行設置PATH變量。
重定向所有命令的輸出到一個文件,以便當
launchd
啓動腳本(在我的情況下,錯誤並沒有出現在/var/log/system.log
出於某種原因)出現錯誤,你可以看到。
謝謝!我發現這個問題,你可以檢查我的編輯2 – tonix