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

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

コンソール内で動かす

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

Windows:
TestWrapper.bat
Unix:
./testwrapper console

注意

Wrapper ver. 3.0.5 以前では、testwrapper スクリプトは UNIX 上で PID ファイル/var/run ディレクトリに書き込もうとしました。 ルート以外のユーザーはスクリプトの PIDDIR 変数を必要な権限のあるディレクトリーへ変更する必要がありました。 この問題は、Wrapper ver. 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 からログアウトするなどで強制的に落ちます。 シャットダウンフックを使うことで、これらの問題を回避することができます。 Wrapper はネイティブライブラリを使い、 直接的にシステムシグナルを検知する機能を実装しています。 これにより、Windows サービルとしてインストールされた 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 ver. 3.1.0 では、新しいタイマー機能が追加され、 これによりティックカウントが絶対値ではなく、CPU 受信量を反映したレートで増加されるため、Wrapper が 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 サンプルアプリケーションが削除されました。

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 デーモンとして動かす際の制限方法については こちらのページ をご確認ください。