環境設定された実行可能パスを使用してsystemdユニットファイルを作成する


17

Javaアプリケーション用のsystemdユニットファイルを作成していますが、起動に使用するJavaのバージョンを制御したいと思います。私の(簡略化された)サービスファイルは

[Service]
Type=simple
EnvironmentFile=%h/Documents/apps/app/app-%i/app.cfg
ExecStart=${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar %h/Documents/apps/app/app-%i/myapp.jar
SuccessExitStatus=143

起動しようとするとエラーが返されます

Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/app@.service:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: app@1.0.0.service lacks both ExecStart= and ExecStop= setting. Refusing.

私はそれJAVA_HOMEが正しく設定されていることを知っています。ExecStart最初に行を変更してから/usr/bin/java、それを-DsomeOption=${JAVA_HOME}うまく追加できるように追加すると、

明らかな回避策はラッパースクリプトを作成することですが、サービスファイルを使用するポイントを無効にすると感じています。

ユニットファイルを使用してJavaアプリケーションのJAVA_HOMEを設定するにはどうすればよいですか?


ラッパースクリプトがサービスファイルを使用する目的を正確に無効にするのはなぜですか?それでも、systemdのシーケンスと依存関係の追跡、監視などを利用できます。基本的に、systemdは、SysVinitで持っていたフリーフォームプログラマビリティを無効にして、組み込みのDTRTロジックを優先します。「正しいこと」がsystemdでできないことである場合、シェルスクリプトのようにsystemdの外部に配置する必要があります。
ウォーレンヤング

@WarrenYoung-シェルスクリプトの管理を突然再開したため。私の場合、シェルスクリプトを管理しないことは、他の部分よりも便利です。
ロバートムンテアヌ

本当に問題は見当たりません。あなたが管理しなければならないすべての実行可能ファイルについても心配して日々を過ごしていますか?:)
ウォーレンヤング

3
systemd.service(5)から:「最初の引数(つまり、実行するプログラム)は変数ではないことに注意してください。」これが、$ {JAVA_HOME}がアプリケーションパスの先頭で展開されず、後の時点で使用される場合の理由を説明しています。
ウィーランド

@WarrenYoung-バイナリよりも単一のラッパーを好む。それは誰にとっても問題ではないことを理解していますが、それは私のためです:
ロバートムンテアヌ

回答:


12

systemd.service(5)の「コマンドライン」セクションから:

最初の引数(つまり、実行するプログラム)は変数ではないことに注意してください。

インスタンス指定子の使用を提案するつもり%iでした(systemd.unit(5)で詳細を確認できます)が(今はsystemd.service(5)に戻ります):

コマンドラインの最初の引数(つまり、実行するプログラム)に指定子を含めることはできません。

この時点での最良のオプションは、ウォーレンヤングが示唆するように、Javaバイナリの実行をラップするシェルスクリプトを作成することです。または、「コマンドライン」セクションのシェルコマンドラインの例systemd.service(5)には次の例があります。

ExecStart=/bin/sh -c 'dmesg | tac'

あなたができる(テストされていない):

ExecStart=/bin/sh -c '${JAVA_HOME}....'

2

別の同様のオプションは、使用すること/usr/bin/envです:

ExecStart=/usr/bin/env "${JAVA_HOME}/bin/java" -jar ...

この方法'では、コマンド全体を引用符で囲む必要がなく、引用符で囲まれたものをネストする必要がある場合に便利です。

PS。サイドノートとして、Systemdファイルでは変数名を{中括弧}で囲むことが重要です。そうしないと、変数が正しく認識されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.