(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Linux/RHEL】systemctlでの起動が環境変数起因で動かない際の対処法

スポンサーリンク

事象

ExecStart=に記載のあるコマンドをコンソールから実行すると起動ができるが、systemctlからは起動ができない。
具体的には以下のようにJavaのバージョンが原因で起動できていないように見える。

# systemctl status rhbk
× rhbkservice - Keycloak Application Server
     Loaded: loaded (/etc/systemd/system/rhbk.service; disabled; preset: disabled)
     Active: failed (Result: exit-code) since xx; 2s ago
   Duration: 182ms
    Process: 57234 ExecStart=/root/rhbk/bin/kc.sh start-dev (code=exited, status=1/FAILURE)
   Main PID: 57234 (code=exited, status=1/FAILURE)
        CPU: 223ms

xx Started Keycloak Application Server.
xx kc.sh[57309]: Error: LinkageError occurred while loading main class io.quarkus.boots>
xx kc.sh[57309]:         java.lang.UnsupportedClassVersionError: io/quarkus/bootstrap/r>
xx systemd[1]: rhbk.service: Main process exited, code=exited, status=1/FAILURE
xx systemd[1]: rhbk.service: Failed with result 'exit-code'.
環境情報
  • Red Hat Enterprise Linux : 9.3 (Plow)

原因/解決策

systemctlで実行時に環境変数が渡されていないから。

対応として/etc/sysconfig/配下に必要な環境変数を定義したファイルを配置した上で

PATH=/usr/lib/jvm/java-17-openjdk-17.0.11.0.9-2.el9.x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

サービスファイル(/etc/systemd/system/rhbk.service)に同ファイルをEnvironmentFileとして指定すると

[Service]
ExecStart=/root/rhbk/bin/kc.sh start-dev
EnvironmentFile=/etc/sysconfig/rhbk
...

想定通り起動した。

以下、補足です。

補足

systemctlはデフォルトで環境変数を読み込んでくれないため、ターミナルでそのまま実行すると成功するコマンドがsystemctl経由で叩くと失敗するケースがあります。

どの環境変数が効いているか分からない場合はprintenvコマンドの結果を見ながら値を入れていく方法がおすすめです。

# which printenv
/usr/bin/printenv

以上、ご参考になれば幸いです。