ユーザーが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
は、私が作成したシェルスクリプトです:
#!/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
とps aux | grep grunt
が表示され、コマンドが実行されています。 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
を実行しようとする:(いずれかの方法で
Jun 11 18:22:24 antons-mbp com.apple.xpc.launchd[1] (org.grunt.watch[83009]): Service exited with abnormal code: 1
:/var/log/system.log
は私に語った、sudoを使用して
daemon: fatal: refusing to execute unsafe program: /usr/local/bin/grunt (/usr/local/lib is group writable)
:
sudo launchctl unload /Library/LaunchAgents/org.grunt.watch.plist && sudo launchctl load /Library/LaunchAgents/org.grunt.watch.plist
/tmp/grunt-watch-launchd.log
は、次の行が含まれていますlaunchctl
とsudoがある場合とない場合)、サービスが開始されていないことを確認できますd:
mymachine:~ user$ launchctl list | grep grunt
- 0 org.grunt.watch
ユーザーのログイン時にこのスクリプトをデーモンとして実行するには、何が問題なのですか。
ご協力いただきありがとうございます。
EDIT
: は、私は私は、Mac OS X 10.12シエラは、npm
でうなり声を設置し使用して(それが役立つ可能性がある場合)私はのMacBook Pro(13インチ、2012ミッド)を使用していますと言うことを忘れていました。
EDIT 2: 問題が見つかりました。launchd
エージェントとして実行しているとき、エージェントのユーザーが自分のユーザーではないため、スクリプトはコマンドを見つけることができませんでした。したがって、127エラーが発生しました。
だから、これは本当に簡単launchd
エージェントに貼り付け私のようなすべての男のためにある:
は常にあなたが使用するコマンドは、コマンドを起動したユーザのPATHにあることを確認してください。絶対パスを使用し、必要に応じてスクリプトの最初の行にPATH変数を設定します。
launchd
は(私の場合にはエラーが何らかの理由で/var/log/system.log
に表示されませんでした)スクリプトを起動したときにエラーが発生した場合、あなたが見ることができるようには、ファイルにすべてのコマンドの出力をリダイレクトします。
ありがとうございます!私は問題を発見した、あなたは私のEDIT 2をチェックすることができます – tonix