事象
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
以上、ご参考になれば幸いです。