web-dev-qa-db-ja.com

Mac OSXのlaunchctlを使用してサービスを開始する方法

Launchctlを使用して、構成plistファイルがサービスとして読み込まれないのはなぜですか?

私はOSX Yosemiteを実行していて、launchctlの使用に関するこの優れたチュートリアルを読みました http://nathangrigg.net/2012/07/schedule-jobs-using-launchd/

私はサービスの構成を使用して正しい.plistファイルを作成しました(これは数年前に作成した作業用plist構成ファイルのほぼ完全なコピーであるため、これは正しいことを知っています)。入力します

launchctl load ~/Library/LaunchAgents/com.Apple.myservice.plist

それに反応する

~/Library/LaunchAgents/com.Apple.myservice.plist: File exists

それはひどく説明的ではありませんが、私は行き、タイプします

launchctl start com.Apple.myservice

出力はなく、何も起こりません。私も使用しようとしました

launchctl enable ~/Library/LaunchAgents/com.Apple.myservice.plist

そして私はちょうど得ます

Usage: launchctl enable <service-target>

に応じて。

誰かが、OSX Yosemiteでlaunchdサービスをロードするための正しい構文で返信できますか?

6
almel

launchdは「奇妙な」状態に簡単に移行できます。

  • loadは、構成ファイルをread読み取り、schedule打ち上げ。
  • unloadstopを意味しますおよび構成ファイルのスケジュールを解除します
  • startはサービスを開始します(スケジュールは無視します)
  • stopはサービスを停止します(ここでも、スケジュールは無視されます)

一般に、「再起動」する場合は、次のように構成をアンロードして再ロードします。

launchctl unload -w ~/Library/LaunchAgents/com.Apple.myservice.plist
launchctl load -w ~/Library/LaunchAgents/com.Apple.myservice.plist

-wは「書き込み」を意味します。これは、変更が再起動に影響することを意味します(すべてのログインまたはブートをロードします...またはログインまたはブート時に二度とロードしません)。

システムレベルのサービスの場合(/Library/LaunchDaemonsまたは/Library/LaunchAgentsSudoを使用して実行する必要がある場合があります(誤ってSudoを使用せずに実行した場合は、Sudoを使用せずにアンロードしてから、Sudoを使用して再ロードする必要があります)。

startloadにさせるファイル内のキーはRunAtLoadです(そして、何らかの理由で死んだ場合でもKeepAliveは実行を続けます)。

<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>

Launchctl自体からデバッグロギングを取得するのは難しい場合がありますが、キーStandardErrorPathおよびStandardOutPathは、情報の欠落または不良(展開されていない環境変数または書き込み不可のパスなど)。指定するパスが、プロセスを実行しているユーザーによって書き込み可能であることを確認してください。

<key>StandardErrorPath</key>
<string>/tmp/appname-error.log</string>
<key>StandardOutPath</key>
<string>/tmp/appname-info.log</string>

デバッグが非常に難しいため、 LaunchControl または launched を使用して、それを launchd.info の正常な読み取りと混合することをお勧めします。

また、ここにはいくつかのデバッグのヒントがあります: https://serverfault.com/questions/183589/how-do-i-activate-launchd-logging-on-os-x

私自身はまだ試していませんが、このソリューションは最も簡単に見えます。

Sudo launchctl log level debug 
tail -f /var/log/system.log
7
CoolAJ86

今日も同様の問題に遭遇しました。

サービスをアンロードして再度ロードするだけで、File exists問題。

Plistファイルを更新するたびに、そうしなければならないようです。

4
daisy