TestWrapper サンプルアプリケーションを動かす

このページでは、Wrapper に同梱して提供している TestWrapper サンプルアプリケーションを活用して、 様々な Wrapper の障害リカバリー(回復)機能の紹介をします。

コンソール内で動かす

コンソール内でアプリケーションを動かすには、bin ディレクトリーに入っている次のスクリプトを実行してください:

Windows:
TestWrapper.bat
Unix:
./testwrapper console

注意

Wrapper バージョン 3.0.5 以前では、testwrapper スクリプトは UNIX 上で PID ファイル/var/run ディレクトリーに書き込もうとしました。 ルート以外のユーザーはスクリプトの PIDDIR 変数を必要な権限のあるディレクトリーへ変更する必要がありました。 この問題は、バージョン3.0.5 で改善され、Wrapper は PID ファイルをスクリプトと同じ場所に書き込むようになりました。

アプリケーションが開始すると、次のウィンドウが表示されます:

また、コンソール内で次のようにも見えるはずです:

コンソール出力例:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()

コンソール出力の解説から始めます。 最初の列のデータでは、ソース出力が表示されます。 「wrapper」 で始まる行は、ネイティブ Wrapper アプリケーションからの出力です。 「jvm 1」 で始まる行は、JVM からの出力です。 「jvm」 に続く数字は、Wrapper が起動を繰り返した JVM の番号を示します。 TestWrapper サンプルアプリケーションのインターフェイスに触れ始めると、どのように動作しているのか見ることができます。

デフォルトでは、全てのコンソール出力はログ化され、 「logs/wrapper.log」 に出力されます。 しかし、ログファイルのフォーマットは各出力メッセージのログレベルやタイムスタンプを 含めるように設定されています。

ログファイルの出力例:
STATUS | wrapper  | 2001/12/06 16:18:27 | --> Wrapper がコンソールとして開始しました
STATUS | wrapper  | 2001/12/06 16:18:28 | JVM 起動中…
INFO   | jvm 1    | 2001/12/06 16:18:29 | 初期化中…
INFO   | jvm 1    | 2001/12/06 16:18:30 | Wrapper (Version 3.x.x)
INFO   | jvm 1    | 2001/12/06 16:18:30 | 
INFO   | jvm 1    | 2001/12/06 16:18:30 | start()

各出力のフォーマットやログレベルを次のプロパティを利用することで個別に設定することが可能です:

TestWrapper サンプルアプリケーションには多くのボタンが用意されています。 それらは、Wrapper の様々な機能をテストするのにご利用いただけます。 各ボタンについては、ボタンをアクティベートする場合にコンソールに表示される 出力とともに以下に説明されています。

GUI 以外にも TestWrapper サンプルアプリケーションをターミナル内からだけでもコントロールできます。 このモードは、「console」と呼ばれ、GUI と同じ機能を持っていますが、アプリケーションはユーザーのインプットを待機し、 各種テストはボタンをクリックせず、端末内にコマンドを入力することでトリガーされます。

TestWrapper アプリケーションを 「console」モードで動かす
jvm 1    | WrapperManager: Initializing...
jvm 1    | TestWrapper: Initializing...
jvm 1    | TestWrapper: start()
jvm 1    | TestWrapper: ActionServer Enabled.
jvm 1    | TestWrapper:   Telnet localhost 9999
jvm 1    | TestWrapper:   Commands:
jvm 1    | TestWrapper:     S: Shutdown
jvm 1    | TestWrapper:     H: Expected Halt
jvm 1    | TestWrapper:     R: Restart
jvm 1    | TestWrapper:     D: Thread Dump
jvm 1    | TestWrapper:     U: Unexpected Halt (Simulate crash)
jvm 1    | TestWrapper:     V: Access Violation (Actual crash)
jvm 1    | TestWrapper:     G: Make the JVM appear to be hung.
jvm 1    | TestWrapper:
jvm 1    |
jvm 1    | Start prompting for actions.
jvm 1    | Input an action ('help' for a list of actions):
help
jvm 1    | Read action: help
jvm 1    |
jvm 1    | [ACTIONS]
jvm 1    |    help                     : Shows this help message
jvm 1    |   Actions which should cause the Wrapper to exit cleanly:
jvm 1    |    stop0                    : Calls WrapperManager.stop(0)
jvm 1    |    exit0                    : Calls System.exit(0)
jvm 1    |    stopimmediate0           : Calls WrapperManager.stopImmediate(0)
jvm 1    |    stopandreturn0           : Calls WrapperManager.stopAndReturn(0)
jvm 1    |   Actions which should cause the Wrapper to exit in an error state:
jvm 1    |    stop1                    : Calls WrapperManager.stop(1)
jvm 1    |    exit1                    : Calls System.exit(1)
jvm 1    |    nestedexit1              : Calls System.exit(1) within WrapperListener.stop(1) callback
jvm 1    |    stopimmediate1           : Calls WrapperManager.stopImmediate(1)
jvm 1    |   Actions which should cause the Wrapper to restart the JVM:
jvm 1    |    access_violation_native  : Calls WrapperManager.accessViolationNative()
jvm 1    |    appear_hung              : Calls WrapperManager.appearHung()
jvm 1    |    halt0                    : Calls Runtime.getRuntime().halt(0)
jvm 1    |    halt1                    : Calls Runtime.getRuntime().halt(1)
jvm 1    |    restart                  : Calls WrapperManager.restart()
jvm 1    |    restartandreturn         : Calls WrapperManager.restartAndReturn()
jvm 1    |   Additional Tests:
jvm 1    |    appear_slow_1            : Calls WrapperManager.appearSlow(1)
jvm 1    |    appear_slow_5            : Calls WrapperManager.appearSlow(5)
jvm 1    |    appear_slow_reset        : Calls WrapperManager.appearSlow(0) to return to normal
jvm 1    |    deadlock                 : Executes some deadlocking code to test deadlock detection
jvm 1    |    outofmemory              : Simulates an OutOfMemoryError being thrown
jvm 1    |    ignore_events            : Makes this application ignore control events.
jvm 1    |    dump                     : Calls WrapperManager.requestThreadDump()
jvm 1    |    deadlock_out             : Deadlocks the JVM's System.out and err streams.
jvm 1    |    users                    : Start polling the current and interactive users.
jvm 1    |    groups                   : Start polling the current and interactive users with groups.
jvm 1    |    console                  : Prompt for actions in the console.
jvm 1    |    idle                     : Do nothing just run in idle mode.
jvm 1    |    properties               : Dump all System Properties to the console.
jvm 1    |    configuration            : Dump all Wrapper Configuration Properties to the console.
jvm 1    |    gc                       : Perform a GC sweep.
jvm 1    |    is_professional          : Displays whether or not this is a Professional Edition Wrapper.
jvm 1    |    is_standard              : Displays whether or not this is at least a Standard Edition Wrapper.
jvm 1    |    exec <cmd>               : Executes a managed child process.
jvm 1    |    exec_detached <cmd>      : Executes a detached child process.

「console」モードでアプリケーションを起動するには、追加の「console」引数が必要です。 Unix 上では、この引数はスクリプトに渡す「console」コマンドと混同しない用に注意してください。 (そのため、「console」という言葉はスクリプトを起動するときに2回出るはずです。)

Windows:
TestWrapper.bat console
Unix:
./testwrapper console console

アプリケーションはウィンドウを閉じたり、あるいは「Stop()」や「Exit()」 ボタンを押すことでいつれも停止できます。 それと、ターミナルで[CTRL]+[C] を押すことでクリーンシャットダウンを要求できます。

Wrapper 機能をテストする(内部終了と問題)

このセクションでは、様々なイベントに対して、Wrapper がどのように応答するのかをご紹介します。 各種イベントはユーザーインターフェイズのボタンを押すことでテストすることができます。

Stop

この [Stop] ボタンは、 [WrapperManager.stop(0)] を呼び出し、キレイに JVM を終了します。

コンソール出力:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | stop(0)
wrapper  | <-- Wrapper が停止しました

ご覧のとおり、アプリケーションは、[stop()] メソッドを呼び出し、キレイに停止しました。

Exit

この [Exit] ボタンは、「System.exit()」 への予想外のコールをトラップして キレイにアプリケーションを停止する Wrapper の能力をテストします。

コンソール出力:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | stop(0)
jvm 1    | here
wrapper  | <-- Wrapper が停止しました

練習として、conf/wrapper.confファイルを編集して(コメント記号を外して)、 [wrapper.disable_shutdown_hook=TRUE] プロパティを有効化してください。 (この練習を終えたら忘れずに元に戻してください)

では、TestWrapper サンプルアプリケーションを再始動してみましょう。

コンソール出力:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | JVM が予想外に終了しました。
wrapper  | JVM 起動中...
jvm 2    | 初期化中...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Wrapper は「System.exit()」へのコールを 検知しないため、JVM は単にクラッシュして再起動します。

Halt

この[Halt]ボタンは、JVM を強制的に停止するために、とても低いレベルのメソッドをコールします。 このケースでは、シャットダウンフックが実行されておらず、 Wrapper はそれを検知する手段がありません。

コンソール出力:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | JVM が予想外に終了しました。
wrapper  | JVM 起動中...
jvm 2    | 初期化中...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Wrapper は「JVM がクラッシュした」と想定して、JVM を再起動させていることに注目してください。

再起動リクエスト

WrapperManager.restart()] をコールすることで、JVM をキレイに再起動しています。

コンソール出力:
wrapper  | --> Wrapperがコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | JVM が再起動をリクエストしました。
jvm 1    | stop(0)
wrapper  | JVM 起動中...
jvm 2    | 初期化中...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

ご覧のとおり、アプリケーションは、 [stop()]メソッドを呼び出し、キレイに再起動しました。

ネイティブアクセス違反

Java Service Wrapper は、軽量な ネイティブライブラリー を含んでおり、 システムイベントを取り扱うときに利用されます。 ライブラリーには、ネイティブメソッドも含んでおり、テスト用に利用され、 「NULL」参照によるネイティブコードでアクセス違反を引き起こします。

JVM 次第ですが、これは異なる出力結果となります。

コンソール出力(オラクル JVM):
wrapper  | -->jvm 1    | WrapperManager: 警告: アクセス違反の引き起しを試行中…
jvm 1    | #
jvm 1    | # A fatal error has been detected by the Java Runtime Environment:
jvm 1    | #
jvm 1    | #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007fffc9aee46f, pid=14352, tid=12948
jvm 1    | #
jvm 1    | # JRE version: Java(TM) SE Runtime Environment (8.0_45-b15) (build 1.8.0_45-b15)
jvm 1    | # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.45-b02 mixed mode windows-amd64 compressed oops)
jvm 1    | # Problematic frame:
jvm 1    | # C  [wrapper.dll+0xe46f]  Java_org_tanukisoftware_wrapper_WrapperManager_accessViolationInner+0x1f
jvm 1    | #
jvm 1    | # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
jvm 1    | #
jvm 1    | # An error report file with more information is saved as:
jvm 1    | # C:\wrapper\bin\hs_err_pid14352.log
jvm 1    | #
jvm 1    | # If you would like to submit a bug report, please visit:
jvm 1    | #   http://bugreport.java.com/bugreport/crash.jsp
jvm 1    | # The crash happened outside the Java Virtual Machine in native code.
jvm 1    | # See problematic frame for where to report the bug.
jvm 1    | #
wrapper  | JVM は予想外に終了しました。
wrapper  | JVM 起動中…
jvm 2    | WrapperManager: 初期化中…
jvm 2    | TestWrapper: 初期化中…

ご覧のとおり、JVM にアクセス違反を引き起こし、エラーダンプを表示して、終了しています。 Wrapper は、これを即座に検知し、5秒間のポーズ後、 新しい JVM でアプリケーションを再起動したため、その接頭が「jvm 2」になっています。 クラッシュに関しての有効な情報は、詳しく参照できるように全てログ化されています。

JVM ハングアップのシミュレーション

このテストは、Wrapper に「JVM がハングアップした」と思わせるテストです。 30 秒後、Wrapper はタイムアウトされ、JVM がリカバリー(回復)しないと判断して、JVM を再起動させます。

コンソール出力:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | 警告: JVM がハングアップしているように見えます...
wrapper  | JVM ハングアップの模様: JVMからのシグナル待ちのタイムアウト。
wrapper  | JVM はリクエストに応じて終了しませんでした、中止しました
wrapper  | JVM 起動中...
jvm 2    | 初期化中...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Wrapper 機能のテスト(外部終了)

上記のセクションでは、アプリケーションを終了したり、自らの意思で終了させるなど、 全ての例をカバーしました。 その他にも、外部要因から Wrapper 自身を守ることができる機能について紹介します。

[CTRL]+[C]

ほとんどの Java アプリケーションでは、ユーザーの[CTRL]+[C]のキー操作や Windows からログアウトするなどで むしろ強制的に落ち、Windows からログアウトします。 シャットダウンフックを使うことで、これらの問題を回避することができますが、 Wrapper はネイティブライブラリーを使い、 直接的にシステムシグナルを検知する機能を実装しています。 これにより、Windows サービルの1としてインストールされた Java アプリケーションが ユーザーのログオフ時に停止されることなく、継続して動作できることを可能にしています。

テストとして、コンソール(コマンドウィンドウ)内で、[CTRL]+[C]のキー操作を試してください。

コンソール出力:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | [CTRL]+[C]キー操作がトラップされました。  シャットダウン中。
jvm 1    | stop(0)
wrapper  | <-- Wrapper が停止しました

コンソールアプリケーションがまだ動作しているときに、 ログアウトすることにより、バリエーションを見ることができます。 Wrapper は、正しくアプリケーションを終了します。

コンソール出力:
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    | 
jvm 1    | start()
wrapper  | ユーザーがログアウトしました。シャットダウン中。
jvm 1    | stop(0)
wrapper  | <-- Wrapper が停止しました

Unix プラットフォーム上では、[console]コマンドが Wrapper の起動に利用したスクリプトに引き渡されている場合のみ [CTRL]+[C]のキー操作を利用することができます。

start]コマンドを使って Wrapper が起動した場合には、 サービス/デーモンとして異なるプロセスで開始するため、コンソールにアクセスできません。 Wrapper の生成されたインスタンスを停止するためには、 Wrapper 起動に利用したスクリプトと同じスクリプトを実行してください。 今回だけ[stop]コマンドを指定します:

コンソール出力:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | シャットダウン中。
jvm 1    | stop(0)
wrapper  | <-- Wrapper が停止しました

終了プロセス

無理そうですが、 アプリケーションプロセスが他の外部アプリケーションによって強制終了されることも可能です。 このテストは、突然、JVM が自発的に停止するケースをシミュレートします。 UNIX システム上では、 「kill -9」シグナルで、Java プロセスを強制終了することができます。 Windows プラットフォーム上では、タスクマネージャーを開き、プロセスタブを選択し、 [java.exe]プロセスを探して、それを強制終了してください。

コンソール出力:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
wrapper  | JVM が予想外に終了しました。
wrapper  | JVM 起動中...
jvm 2    | 初期化中...
jvm 2    | Wrapper (Version 3.x.x)
jvm 2    |
jvm 2    | start()

Wrapper は何も問題なく JVM を再起動させます。

もし、Java プロセスを強制終了ではなく、Wrapper プロセスが強制終了されるならば、 WrapperManager はリカバリー(回復)モードが動いているということです。 Java プロセス内部のWrapperManagerが Java プロセスが放棄されたと想定して、Wrapper の消失に反応しています。 これにより、Wrapper プロセスが落ちた後、30 秒でキレイに JVM がシャットダウンされます。

システムの高い負荷 や システムサスペンド

Wrapper や JVM、あるいは両方が、ある長い時間、CPU サイクルを与えられず拒否されるケースがあります。 これが起きるのは、 非友好的にリソースプロセスが、ある一定の期間、CPU の 100% 消費を始めている場合に、 起きることがあります。 また、ユーザーがシステムを RAM やディスクにサスペンドした場合にも、発生する可能性があります。 システムがレジューム(再開)されるとき、全ての実行中のアプリケーションに消失時間が発生します。 Wrapper は、この「消失時間の発生」を認識する機能を備えており、 JVM プロセスの不要な再起動を回避することが可能になります。 次の出力では、レジューム(再開)される前の 255 秒間、 RAM(メモリ)へサスペンドされるときに何が起きるかを、示しています。

コンソール出力例:
wrapper  | --> Wrapper がコンソールとして開始しました
wrapper  | JVM 起動中...
jvm 1    | 初期化中...
jvm 1    | Wrapper (Version 3.x.x)
jvm 1    |
jvm 1    | start()
jvm 1    | JVM プロセスは、255 秒間、CPU 時間を何も受信していません。タイムアウトを延長中。
wrapper  | Wrapper プロセスは、255 秒間、CPU 時間を何も受信していません。タイムアウトを延長中。

Wrapper バージョン 3.1.0 時点で、新しいタイマー機能が追加され、ティックカウントは、絶対的ではなく CPU 受信量を反映するレートでインクリメントされますので CPU リソースが不足している状態でも安定的に作動ができます。 これは、高負荷によるタイムアウトが非常に起こりにくいことを意味します。 タイマー機能を有効ンいするには、「wrapper.use_system_time」 プロパティが 「FALSE」 に設定されていることをご確認ください。

Windows サービスとして動かす

Windows サービスとして動かすとき、TestWrapper サンプルアプリケーションはユーザーインターフェイスを表示することができません。 そのため、上記のテストを起動することができません。 しかしながら、いくつかのテストをして、 Wrapper が Windows サービスつとして正しく動作することを実証できます。

最初に、次のコマンドを実行して、TestWrapper サンプルアプリケーションを Windows サービスとしてインストールしてください:

コマンド:
InstallTestWrapper-NT.bat
次の出力が表示されます:
wrapper  | TestWrapper サンプルアプリケーション インストールされました。

一旦、TestWrapper サンプルアプリケーションがサービスとしてインストールしたら、 早速、それをスタートしてみましょう。

コマンド:
net start TestWrapper
次の出力が表示されます:
TestWrapper サンプルアプリケーションサービス 開始中。
TestWrapper サンプルアプリケーション サービスが正常に開始されました。

そのサービスは、次のコマンドを実行して、アンインストールすることができます:

UninstallTestWrapper-NT.bat
サービスを動かしているなら、次の出力が表示されます:
wrapper  | サービスは動作しています。停止中...
wrapper  | 停止の待機中...
wrapper  | TestWrapper サンプルアプリケーションが停止しました.
wrapper  | TestWrapper サンプルアプリケーション removed.

logs/wrapper.log」 の中身を見ると、このコンソールにとても類似した出力が表示されまるはずです。 (ただし、今回のスタートメッセージは、アプリケーションがコンソールとしてではなく、サービスとして開始されていることを知らせています。)

wrapper.log
wrapper  | 2001/12/06 17:34:21 | --> Wrapper がサービスとして開始しました
wrapper  | 2001/12/06 17:34:21 | JVM 起動中...
jvm 1    | 2001/12/06 17:34:22 | 初期化中...
jvm 1    | 2001/12/06 17:34:22 | Wrapper (Version 3.x.x)
jvm 1    | 2001/12/06 17:34:22 |
jvm 1    | 2001/12/06 17:34:22 | start()

Windows サービス上で起きる、いくつかその他のアクションの結果です:

ユーザーログアウトとその復帰

ユーザーのログアウトでログエントリが作成されますが、サービスには影響ありません。

wrapper.log
wrapper  | 2001/12/06 17:39:39 | --> Wrapper がサービスとして開始しました
wrapper  | 2001/12/06 17:39:40 | JVM 起動中...
jvm 1    | 2001/12/06 17:39:40 | 初期化中...
jvm 1    | 2001/12/06 17:39:40 | Wrapper (Version 3.x.x)
jvm 1    | 2001/12/06 17:39:40 |
jvm 1    | 2001/12/06 17:39:41 | start()
wrapper  | 2001/12/06 17:40:07 | ユーザーがログアウトしました。無視しました。
jvm 1    | 2001/12/06 17:40:07 | ControlEvent(202)

マシン再起動

これにより、「ログアウト」シグナルに続き、「シャットダウン」シグナルが出ます。 サービスがキレイにシャットダウンされると、マシン再起動の後、戻ってきます。

ユーザーのログアウトでログエントリが作成されますが、サービスには影響ありません。

wrapper.log
wrapper  | 2001/12/06 17:41:04 | --> Wrapper がサービスとして開始しました
wrapper  | 2001/12/06 17:41:05 | JVM 起動中...
jvm 1    | 2001/12/06 17:41:05 | 初期化中...
jvm 1    | 2001/12/06 17:41:05 | Wrapper (Version 3.x.x)
jvm 1    | 2001/12/06 17:41:05 |
jvm 1    | 2001/12/06 17:41:05 | start()
wrapper  | 2001/12/06 17:41:25 | ユーザーがログアウトしました。無視しました。
jvm 1    | 2001/12/06 17:41:26 | ControlEvent(202)
wrapper  | 2001/12/06 17:41:27 | マシンがシャットダウンしています。
jvm 1    | 2001/12/06 17:41:27 | ControlEvent(203)
jvm 1    | 2001/12/06 17:41:28 | stop(0)
wrapper  | 2001/12/06 17:41:29 | <-- Wrapper が停止しました
wrapper  | 2001/12/06 17:44:12 | --> Wrapper がサービスとして開始しました
wrapper  | 2001/12/06 17:44:12 | JVM 起動中...
jvm 1    | 2001/12/06 17:44:17 | 初期化中...
jvm 1    | 2001/12/06 17:44:21 | Wrapper (Version 3.x.x)
jvm 1    | 2001/12/06 17:44:21 |
jvm 1    | 2001/12/06 17:44:23 | start()

Wrapper を Windows サービスとして動かす際の制限方法については こちらのページ をご確認ください。

Unix デーモンとして動かす

start]コマンドで Wrapper を起動させることで、バックグラウンドで動かせます。 グラフィカルユーザーインタフェース(GUI)を表示できないターミナルから起動された場合、 アプリケーションはコンソールモードに切り替わりますが、 コンソールでデーモンを制御することはできないため、あまり役に立ちません。

Unix:
./testwrapper start

一旦、アプリケーションが起動すると、デーモンとして実行されている TestWrapper サンプルアプリケーションのユーザーインターフェイスがコンソールアプリケーションと全く同様に使用できます。

Wrapper のインスタンスをデーモンとして実行しないようにするには、[stop]コマンドで同じスクリプトをご利用ください。

Unix:
./testwrapper stop

Wrapper を Unix デーモンとして動かす際の制限方法については こちらのページ をご確認ください。