web-dev-qa-db-ja.com

systemdを使用するだけではJSVCからどのようなメリットがありますか?

Tomcatのドキュメント describes コンパイルとインストールのプロセス [〜#〜] jsvc [〜#〜] Tomcatをデーモンとして実行するために使用できます。私の理解によれば、JSVCには2つの利点があります。

  1. Rootとして起動し、特権ポート(80や443など)を使用できるようにします。
  2. 「制御されたプロセス」(メインのJavaスレッド))を監視し、障害時にプロセスを再起動する「コントローラープロセス」を作成します。

systemd を学習してきました service unit configuration を含みます。私の限られた理解に基づいて、User=TomcatRestart=on-failure構成ファイルに設定し(希望するユーザー名を使用)、Tomcat.serviceを設定すると、systemdはJSVCと同じタスクを実行できます。

[〜#〜] jsvc [〜#〜]を使用すると、Tomcat.serviceは次のようになります。

[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Environment=CATALINA_PID=/var/run/Tomcat.pid
Environment=Java_HOME=/path/to/Java
Environment=CATALINA_HOME=/opt/Tomcat
...

ExecStart=/opt/Tomcat/bin/jsvc \
    -Dcatalina.home=${CATALINA_HOME} \
    -user Tomcat \
    -Java-home ${Java_HOME} \
    -pidfile ${CATALINA_PID} \
    ...
    org.Apache.catalina.startup.Bootstrap

ExecStop=/opt/Tomcat/bin/jsvc \
    -pidfile ${CATALINA_PID} \
    ...
    -stop \
    org.Apache.catalina.startup.Bootstrap

[Install]
WantedBy=multi-user.target

systemdを使用すると、Tomcat.serviceは次のようになります。

[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking  
PIDFile=/var/run/Tomcat.pid
User=Tomcat
Group=Tomcat
Environment=Java_HOME=/path/to/Java
Environment=CATALINA_HOME=/opt/Tomcat
...

Restart=on-failure

ExecStart=/opt/Tomcat/bin/startup.sh
ExecStop=/opt/Tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

私の好みはsystemdを使用することです。すでにそこにあるので、とにかくそれを使わなければなりません(すべきです)。しかし、私が見落としているJSVCを使用することのメリットを逃してしまうかどうかは、私にはわかりません。

Tomcatをデーモンとして実行したい場合、systemdでは実現できないJSVCで実現できることは何ですか?

また、systemdがJSVCだけでなくJSVCと同じタスクを実行できる場合、JSVの利点を最大限に活用するために提供できる構成のヒントについてもお尋ねしたいと思います。 systemd。

27
user636044

一般に、jsvcが提供する機能のほとんどは、特権ポートのオープンを除いて、systemdが提供します(以下を参照)。可能であれば、systemd機能を直接使用するように切り替えることをお勧めします。これは、物事がより簡単で効率的になるためです。

あなたのユニットファイルはほとんど例外なく、

ExecStart=/opt/Tomcat/bin/startup.sh
ExecStop=/opt/Tomcat/bin/shutdown.sh

この部分は、Java -jar ...へのダイレクトで置き換えることができる別のラッパーのように見えます。

特権ソケットを開く

Systemdでは、これは通常、ソケットのアクティブ化によって行われます。 Systemdはソケットを開き、それをデーモンにオープンファイル記述子(stdin、stdout、stderrなど)として渡します。

その後、デーモンは非特権ユーザーとして起動でき、特権自体は削除されません。デーモンはこれをサポートする必要があり、それ自体でソケットを開くのではなく、指定されたものを使用する必要があります。 Javaの下では、これはJava stdlibでのサポートの欠如によって非常に問題になります。

AFAIK、Tomcatはソケットのアクティブ化をサポートしていないため、特権ポートを使用してデーモンを非特権ユーザーで実行する場合でも、jsvcが必要になる場合があります。

17
zbyszek

この時点では、JSvcを使用します。ただし、必要に応じて、それをSystemdスクリプトでラップします。

  1. JSvcは別の実行可能ファイルであることを覚えておいてください。したがって、通常のシステムユーザーは、たとえばJSvcサービスを設定できます。ほとんどのディストリビューションでは、Systemdはroot権限を設定する必要があると言っても安全です。

  2. また、Java JSvcとProcRun.exeを使用するプログラムで、小さなJavaインターフェースをラップすることで作成しました。これにより、同じサービスコードとUnixおよびWindows OSでのJUnit統合テストなので、JSvcとProcRun.exeを一緒に使用すると、クロスプラットフォームのサービスコードが容易になります。

  3. JSvcには、いくつかの興味深いJavaに役立つ特定のオプションがあります。JVMの起動方法(プロセスまたはDLL)など)など。それらの多くはSystemdスクリプトに組み込まれていますが、その時点ではBashでJSvcを書き換えているだけだと思います。

そのため、特定のTomcatの例ではそれほど魅力的ではありません。ただし、Systemdよりも小さなJSvcサービスラッパーを使用することにはいくつかの利点があります。

7
kervin

Root以外の権限でTomcatを実行したいが、低いポート(<1024)を使用する場合は、jsvcを使用する必要があります。

また、 シャットダウンポートを無効にする が利用可能になります。ただし、標準のシェルスクリプトを使用してTomcatを実行する場合は、shutdown.bat | .shとcatalina.bat | .shが正常に停止できないため、使用できません。

0
user3132194