OS X Lion Serverで YouTrack をセットアップし、launchd
を使用して起動時に起動させようとしています。 Java -Xmx512m -jar youtrack.jar 8080
を使用してコマンドラインから正常に実行できるYouTrackjarファイルをダウンロードしました。また、上記の実行コマンドを this のようなシェルスクリプトでラップしました。これにより、基本的にyoutrack start
とyoutrack stop
を使用してアクティブなインスタンスと対話できます。 Java
プロセスのプロセスIDをファイルに保存し、実行中のインスタンスを停止して1つのインスタンスのみを許可するために終了します。
起動時にこのコマンドを実行するために、man launchd.plist
の指示に従って、単純なlaunchd plistを作成し、/ Library/LaunchDaemonsに配置しました。使用される主なキーは、ProgramArguments
(youtrack start
)とRunAtLoad
(true)です。問題は、コマンドラインから実行すると、youtrack start
がJava
プロセスの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
を使用してください。
Launchedは、プログラムを起動するだけでなく、実行時にプログラムを監視します。デフォルトでは、プログラムは(デーモンとして)実行され続け、他のプログラム(/自身のバックグラウンドコピー/その他)を開始して終了することはありません。プログラムが終了する場合、launchdはyoutrack start
のような実行および終了プログラムに問題を引き起こす可能性のある2つのことを行います。残りのサブプロセス(実際のサーバープロセスなど)を「クリーンアップ」することと、(他の設定に応じて) 「失敗した」プログラムを再試行してください。これを解決するには2つの方法があります。
起動された方法で実行します。起動されたアイテムをJava -Xmx512m -jar youtrack.jar 8080
で直接実行します(コマンドの各「Word」はProgramArguments
配列の個別の要素である必要があることに注意してください)。 <key>KeepAlive</key><true/>
をlaunchd.plistに追加すると、サーバーがクラッシュしたり、何らかの理由で終了したりすると、サーバーが再起動します(これには強制終了も含まれるため、youtrack stop
を書き換えてlaunchctl unload ...
を使用し、launchdに強制終了を実行させる必要があります)。
Launchdに、実行を継続することを期待せず、サブプロセスを強制終了しないように指示します。これを.plistに追加して、デフォルトの動作をオフにします。
<key>KeepAlive</key>
<false/>
<key>AbandonProcessGroup</key>
<true/>