0

スタンドアロン Java アプリケーションがあります。現時点では、クラスパスを設定してから実行する開始スクリプト、つまり、Windows の startApplicatoin.bat と Linux の startApplicatoin.sh を使用して、この Java アプリケーションを実行しています: java -classpath 。

ここで、stopApplication.bat および stopApplication.sh スクリプトを追加する必要があります。この停止スクリプトは、この Java アプリケーションを正常にシャットダウン/閉じる必要があります。

これを達成するために、次の手順を実行する予定です。

1. Java アプリケーションが実行されると、起動されたアプリケーションのプロセス ID が既知のファイル myapplication.pid に保存されます。

ManagementFactory.getRuntimeMXBean().getName() 呼び出しは、Linux と Windows の両方で動作し、プロセス ID を取得するようです。このようにしてプロセス ID を収集し、指定されたファイル myapplication.pid に格納します。

2.アプリケーション停止スクリプトを実行すると、このスクリプトは myapplication.pid ファイルで指定されたプロセス ID に「kill」リクエストを発行します。

Windows の場合、「taskkill」コマンドを実行してこのアプリケーションを停止します。Linux 環境では、「kill」コマンドがその目的を果たします。

そして、私のJavaコードでは、実行したい正常なシャットダウン操作を有効にするaddShutdownHookを追加します。つまり、このプログラムが停止する前に、保持したいものを処理します。

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29

今、私が考えている方法が適切な方法であることを確認するために、健全性チェックを行いたいと思います。または、これを行うより良い方法があります。どんな提案でも大歓迎です。そして、前もって感謝します。

4

2 に答える 2

1

これは のように見えますDaemon

多くのスクリプトに頼ることなく、開始/停止機能を備えたデーモンを実行する最も簡単な方法は、 jsvcを使用することです。これにより、コードで次の 4 つのメソッドを使用してインターフェイスを実装できます。

  • void init(String[] arguments): ここで構成ファイルを開き、トレース ファイルを作成し、ServerSockets、Threadsを作成します。
  • void start(): を開始しThread、着信接続を受け入れます
  • void stop()Thread:を終了するように に通知し、をrun()閉じますServerSocket
  • void destroy(): で作成されたオブジェクトを破棄します。init()

次に、プロセスを追跡し、要求されたときにプロセスを停止する処理を行うプラットフォーム固有のバイナリを用意します。

最も便利なことは、jsvc がスーパーユーザー (UNIX のルート) としてプロセスを開始し、プロセスのオークション実行のために peon ユーザーにドロップできることです。

これは、Tomcat (たとえば) の動作方法です。ルートとして開始し、ポート 80 へのバインドなどの特権アクションを実行します。その後tomcat、セキュリティ上の理由で呼び出される peon 使用にドロップダウンします。

于 2013-08-11T14:15:12.283 に答える