launchd を使用してデーモンを実行する(または起動のみする)

launchd を使用してデーモンを実行する(または起動のみする)

セットアップしようとしていますユートラックOS X Lion Serverで、を使用して起動時に起動するようにしましたlaunchd。YouTrack jarファイルをダウンロードしましたが、コマンドラインから使用して正常に実行できますjava -Xmx512m -jar youtrack.jar 8080。また、実行コマンドを次のようなシェルスクリプトにラップしました。これこれにより、基本的に、およびを使用してアクティブなインスタンスと対話できるようになりますyoutrack startyoutrack stopプロセスのプロセス ID をjavaファイルに保存し、実行中のインスタンスを停止して 1 つのインスタンスのみを許可するなど、終了できるようになります。

起動時にこのコマンドを実行するために、 の指示に従って、単純な launchd plist を作成し、それを /Library/LaunchDaemons に配置しましたman launchd.plist。使用される主なキーはProgramArguments( youtrack start) とRunAtLoad(true) です。問題は、コマンド ラインから実行すると、プロセスyoutrack startの pid を含むファイルが作成されjava、このプロセスがtopまたはで表示されることですps ax。しかし、コマンドが lanuchd ( sudo launchctl load /Library/LaunchDaemons/org.example.youtrack.plist) によって実行されている場合、結果の pid は実行中のプロセスの pid と一致しないため、YouTrack Web サーバーは起動しません。launchd が終了すると、launchd によって開始された java プロセスも終了するかのようです。

ただし、代わりに java コマンドを launchd plist に直接配置すると、正常に動作します。なぜそうなるのか理解したいだけです。launchd の本来の目的はデーモンを起動することだと思っていました。しかし、それはデーモンが存続期間中ずっと launchd 内で実行されなければならないという意味でしょうか。起動時にコマンドを 1 回だけ実行できる、launchd あり (またはなし) でデーモンを起動する別の方法はありますか。基本的に、以前のバージョンの OS X@robootで使用していた方法です。cron

答え1

Launchd はプログラムを起動するだけでなく、プログラムの実行を監視します。デフォルトでは、プログラムが (デーモンとして) 実行し続けるものとし、他のプログラム (/自身のバックグラウンド コピー/その他) を起動して終了するものとはしません。プログラムが終了すると、launchd は実行して終了するプログラムに問題を引き起こす可能性のある 2 つのことを行います。つまり、youtrack start残ったサブプロセス (実際のサーバー プロセスなど) を「クリーンアップ」し、(他の設定によっては)「失敗した」プログラムを再試行します。これを解決するには 2 つの方法があります。

  1. launchd の方法で実行します。つまり、launchd 項目をjava -Xmx512m -jar youtrack.jar 8080直接実行します (コマンドの各「単語」は配列の個別の要素である必要があることに注意してくださいProgramArguments)。launchd .plist に追加すると、何らかの理由でクラッシュまたは終了した場合にサーバーが再起動されます (これには強制終了も含まれるため、を使用するように<key>KeepAlive</key><true/>書き直して、launchd に強制終了を実行させる必要があることに注意してください)。youtrack stoplaunchctl unload ...

  2. launchd に、実行を継続しないように、またサブプロセスを強制終了しないように指示します。デフォルトの動作をオフにするには、これを .plist に追加します。

    <key>KeepAlive</key>
    <false/>
    <key>AbandonProcessGroup</key>
    <true/>
    

関連情報