10

ネイティブにコンパイルされたjsvcを使用してJavaデーモンを起動しています。私はこれをopenSUSE32ビットVMで実行しています。このコードはApacheのデーモンインターフェイスを実装しており、次のコマンドでデーモンを実行しています。

./jsvc -home jre -errfile logs/jsvc.err -pidfile daemon.pid -cp <my_classpath> com.loader.loaderservice.LoaderDaemon

起動して問題なく動作します。通常のユーザーおよびrootとしてデーモンを起動できます。ただし、デーモンを終了しようとすると、jsvcは停止コマンドを発行するのではなく、プロセスを強制終了します。

./jsvc -stop -home jre -outfile logs/jsvc.err -errfile logs/jsvc.err -pidfile daemon.pid -cp <my_classpath> com.loader.loaderservice.LoaderDaemon

デーモンプロセスは終了しますが、シャットダウン手順は実行されません(たとえば、ログに記録したり、データベースにレコードをマークしたりする必要があります)。logs / jsvc.errファイルに次の情報が含まれていますが、他のログは書き込まれません。

Service exit with return value 143

エラーをグーグルで調べた後、同じことを見た人が数人いますが、適切な解決策を見つけることができません(http://mail-archives.apache.org/mod_mbox/commons-dev/200401)。 mbox /%3CPine.GSO.3.96.1040105133739.23375A-100000 @ merlot.tel.uva.es%3E、http://www.tek-tips.com/viewthread.cfm?qid = 1014679 、http ://threebit。 net / mail-archive / tomcat-users / msg03832.html)。

更新: Apacheのウィンドウのサービスランチャー(procrun)を使用すると、問題なくサービスを開始および停止できます。この問題は、jsvcにのみ関連しており、デーモンの停止にのみ関係しているようです。

更新2:http ://commons.apache.org/daemon/jsvc.html#Starting_jsvcを注意深く 読んだ後、使用している停止タグが、指定したpidファイルを介してプロセスにkillコマンドを発行していることに気付きました。jsvcは、設計上、デーモンを実際には正常に停止しないようです。これは、非常に冗長なstopメソッドがメッセージを書き出さないため、私が見ている動作と一致しています。

-stop        stop the service using the file given in the -pidfile option

新しい質問:

  • JavaメインがApacheデーモンインターフェイスを実装している場合、実行中のデーモンで「停止」を発行するにはどうすればよいですか?
  • jsvc以外のものが必要ですか(デーモンの起動または強制終了にのみ役立つようです)?
4

1 に答える 1

5

ああ、わかりました。jsvcstopコマンドが正しく動作していたことがわかります。Linux / Unixで、プロセスがkillコマンドを介して終了メッセージを受信する方法を掘り下げなければなりませんでした。Jsvcは、デーモンにkill -15(ソフトキル)を発行します。UNIXプロセスがメッセージを受信する方法の説明については、 http ://commons.apache.org/daemon/およびhttp://en.wikipedia.org/wiki/Kill_(command )を参照してください。

本当の問題はデーモンの構築にありました。私のstartメソッドでは、shutdownコマンドが発行されるまでデーモンがループしました。これにより、デーモンはデーモンの子プロセスとしての制御を放棄できませんでした。

私はこれを持っていました:

@Override
public void start() 
{
    doStartWork();
    while (isAlive()) 
    {
        Thread.sleep(1000); 
    }
}

私は以下を持っているべきだったので、デーモンスレッドがOSからシグナルを受信できるように戻ることができました。http://commons.apache.org/daemon/jsvc.html#How_jsvc_worksを参照してください。具体的には、「制御されたプロセス:」の下のセクションを参照してください。

@Override
public void start() 
{
    doStartWork();
}
于 2012-08-29T20:40:15.160 に答える