java -jarを指定しないJavaシステムサービス

java -jarを指定しないJavaシステムサービス

私は現在、SpringBootAppをサービスとして実行する作業を進めています。最大の問題は、Devopsがアーティファクトをデプロイし、サービスを生成するAnsibleスクリプトを変更することを許可しないことです(下記の例を参照)。

[Unit]
Description=A Spring Boot application
After=syslog.target

[Service]
User=rating-gateway
ExecStart=/opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.jar
SuccessExitStatus=143
Restart=always
RestartSec=5

技術的には、ExecStartにjava -jarを追加すると正しく実行されますが、Ansibleスクリプトを編集できないため、回避策を見つける必要があります。私はサービスがjava -jarディレクティブを使用しないいくつかのガイドを読んでいましたが、うまく機能するために何が欠けているのかわかりません。

役に立つと思い、PATHにJavaを追加しました。しかしそれは真実ではない。

PATH=/home/rating-gateway/.local/bin:/home/rating-gateway/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/bin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-1.el8_3.x86_64/bin

別のアイデアがありますか?この問題を解決しますか?

まず、ありがとうございます。

PS。私は開発者ですが、サーバーへのrootアクセス権があるので、どんな助けでも歓迎します。


(追加情報用に編集)ExecStartコマンドにjava -jarがない場合。 /var/log/messages で次のエラーが発生します。

Mar 30 08:44:44 systemd[134389]: rating-gateway.service: Failed at step EXEC spawning /opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.jar: Exec format error

しかし、jarが構築されたプラットフォームと展開されたサーバーのアーキテクチャは確認しました。どちらもx84_64です

答え1

さまざまなバイナリ形式(binfmt_misc)のLinuxカーネルサポートを使用できます。これにより、ソルバー(Javaなど)を登録して、最初の数バイトに基づいてファイル(jarファイルなど)を実行できます。より https://www.kernel.org/doc/Documentation/admin-guide/binfmt-misc.rstより多くの情報を知りたいです。

答え2

あなたのエラーは、システムがインタプリタディレクティブを検索するjarファイルを解析しようとしたために発生します#!/interpreter

rating-gateway-0.0.1-SNAPSHOT.jar一つの方法は 。

したがって、2つのファイルが生成されます。

  • /opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.realjar.jar- 実際のjarファイル
  • /opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.jar- 次の内容を含む単純なシェルスクリプト:
#!/usr/bin/env sh

java -jar /opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.jar

関連情報