web-dev-qa-db-ja.com

Centos 7でsystemdを使用してTomcat 8.5を起動する

Tomcat 8.5をインストールしましたが、手動で正常に起動できます。次に例を示します。

su Tomcat startup.sh

正しく動作し、Tomcatはポート8080でサービスを提供できます。

起動を自動化する必要があるため、/ etc/systemd/system/Tomcat-prod.serviceファイルを作成しました。

[Unit]
Description=Tomcat 8.5 servlet container - Production
After=network.target

[Service]
Type=forking

ExecStart=/opt/appservers/production/Apache-Tomcat-8.5.37/bin/startup.sh
ExecStop=/opt/appservers/production/Apache-Tomcat-8.5.37/bin/shutdown.sh

User=Tomcat
Group=Tomcat   

[Install]
WantedBy=multi-user.target

ファイルはわざと裸で、すべての環境変数はsetenv.shにあります。私はそれを使用して実行してみました:

# systemctl daemon-reload
# systemctl start Tomcat-prod

上記の何らかの理由で、Tomcatは起動直後に終了します。理由を説明するログはどこにもありません。 Tomcatは起動時に空のcatalina.outファイルを作成し、systemctlステータスTomcat-prodは以下のみを提供します。

Tomcat-prod.service-Tomcat 8.5サーブレットコンテナ-本番ロード:ロード済み(/etc/systemd/system/Tomcat-prod.service;有効;ベンダープリセット:無効)アクティブ:失敗(結果:終了コード)2019年金曜日以降- 01-04 08:08:27 UTC; 3秒前プロセス:3583 ExecStop = /opt/appservers/production/Apache-Tomcat-8.5.37/shutdown.sh(code = exited、status = 203/EXEC)プロセス:3569 ExecStart =/opt/appservers/production/Apache- Tomcat-8.5.37/bin/startup.sh(code = exited、status = 0/SUCCESS)メインPID:3581(code = exited、status = 0/SUCCESS)

Jan 04 08:08:27 * .net startup.sh [3569]:起動中に既存のPIDファイルが見つかりました。 Jan 04 08:08:27 * .net startup.sh [3569]:古いPIDファイルを削除/クリアします。

誰かが私を正しい方向に向けることができますか?

2
john

Systemdはすべてのサービスの「メインプロセス」を追跡するため、サービスがまだ有効かどうかを正確に把握できます。メインプロセスが終了すると、サービスマネージャは、サービスがクラッシュしたか、サービスが自動的に停止したと見なします。また、サービスが停止すると、残りのすべてのプロセスが自動的に強制終了され、将来の開始のためにクリーンな状態が提供されます。

Type = forkingサービスの場合、どちらが「メイン」プロセスであるかを判断するのは、特にシェルスクリプトのレイヤー、レイヤー、レイヤーの背後に隠れている場合は、やや難しい場合があります。 。 systemdのデフォルトのヒューリスティックは通常のデーモンに適していますが、あなたの場合、Tomcat自体ではなく、シェルスクリプトレイヤーの1つをメインプロセスとして誤検出している可能性があります。したがって、scriptが終了するとすぐに、サービスが停止したと見なされ、残りのサービス(実際のデーモンを含む)が強制終了されます。

2つのオプションがあります。

  • 「pidfile」を使用してメインプロセスを明示的に指定します。これは、SysVinitで使用される従来の方法です。起動スクリプトはすでにいくつかのファイルにTomcatデーモンのプロセスIDを格納しているため、Tomcat.serviceユニットはPIDFile=オプションを使用してそれを参照する必要があります。これにより、サービスマネージャーは自動検出ヒューリスティックを必要とせず、提供されたPIDをメインプロセスとして追跡するだけです。

  • シェルスクリプトを完全に削除し、ExecStart =オプションから直接Tomcatを起動します。これはsystemdに推奨される方法であり、さまざまなディストリビューションのパッケージャによってすでに記述されている.serviceユニットの例を見つけることができます。たとえば、 Arch Linux(Tomcat 8 with Jsvc) です。

3
user1686

Grawityは、著者が他の場所で言及した systemd horror をすでに認識していることは間違いありません。ただし、そのページでは、作成者は「ボーナストラック」を追加しています。 、それらをスポーンしないでください。」 Jonathan de Boyne Pollardのスクリプトにいくつかの調整を加えると、a)を書くのはそれほど難しくないb)は、機能の不要なレイヤー、PIDの不要な使用、追加のデーモン化コマンド、およびc)その出力は明らかです:

# file: /usr/local/lib/systemd/system/Tomcat.service

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

[Service]
User=Tomcat
Group=Tomcat

ExecStart=/opt/Apache/Tomcat/bin/catalina.sh run
Type=simple

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM

# Java process is never killed
SendSIGKILL=no

# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

追加のオプションについては、catalina.shスクリプトの先頭を参照してください。

#   Do not set the variables in this script. Instead put them into a script
#   setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
3
zielot