2017-06-11 73 views
0

我試圖在我的用戶登錄到我的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與我的用戶,一切都很好。我看到一個daemonps 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出於某種原因)出現錯誤,你可以看到。

回答

1

我不熟悉或者gruntdaemon工具,但我敢肯定daemon與launchd會管理的工作方式發生衝突。本質上,你使用了兩種不同的守護進程創建工具,它們以不同的方式做事,你只需選擇一個。

更具體地說,我懷疑daemon在後臺啓動了grunt(即守護它)。但推出期望其管理的工作保持在可以監視和控制它們的前臺。可能發生的情況是launchd啓動腳本,腳本在後臺運行grunt watch,然後退出...並且launchd看到該作業已經退出,並幫助清理剩餘的子進程,如grunt。結果:沒有實際的grunt守護程序正在運行。

您可以將添加到您的.plist中,以告訴launchd不要關閉後臺進程,但真的最好是按照啓動的方式執行操作並將grunt保留在前臺。因此,要麼從腳本中刪除daemon命令,要麼將其替換爲exec,它將運行grunt作爲launchd下的頂級進程(運行時通常會使其成爲shell的子進程,並將shell作爲頂級進程進程在launchd下)。

這裏可能還有其他的問題,但在這個問題得到解決之前很難說清楚。

+0

謝謝!我發現這個問題,你可以檢查我的編輯2 – tonix

相關問題