web-dev-qa-db-ja.com

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

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

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

ただし、代わりにJavaコマンドをlaunchdplistに直接配置すると、正常に機能します。これがなぜであるかを理解したいだけです。launchdのアイデアはデーモンを起動することだと思いました。 。しかし、それはデーモンがその存続期間全体にわたってlaunchd内で実行される必要があることを意味しますか?launchdを使用して(または使用せずに)デーモンを起動する別の方法はありますか?起動時にコマンドを1回実行するだけです。以前のバージョンのOSXでは、cron@robootを使用してください。

2
Simon

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

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

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

    <key>KeepAlive</key>
    <false/>
    <key>AbandonProcessGroup</key>
    <true/>
    
6
Gordon Davisson