kakts-log

programming について調べたことを整理していきます

systemd systemctlでデーモン起動しない場合のログ確認方法

systemd により、os上でsystemctl start hoge のようにデーモンプロセスを起動する際、 プロセスが立ち上がらず、原因がわからなくて困ることがある

$ systemctl start hoge.service


# うまく起動せず、ステータス確認
$ systemctl status hoge -l
● hoge.service 
   Loaded: loaded (/usr/lib/systemd/system/hoge.service; disabled; vendor preset: disabled)
   Active: active (exited) (Result: exit-code) since Wed 2022-03-09 11:11:11:
  Process: 12345 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=1/FAILURE)
  Process: 12345 ExecStart=/bin/sh -c ${JAVA_EXEC} ${JAVA_OPTS} /opt/app/${APP_NAME}.jar ${APP_OPTS} (code=exited, status=127)
 Main PID: 12345 (code=exited, status=127)

Mar 09 11:11:11    host systemd[1]: Started Host Service
Mar 09 11:11:12 host systemd[1]: hoge.service: main process exited, code=exited, status=127/n/a

ここでsystemctl status で-lオプションを実行する。 systemctlによるデーモンプロセス起動時に、bashのstatus終了コード127で落ちているのがわかる。
127番はコマンドが見つからなかったときに返るエラーというのはわかりますが、エラーの詳細がこれだけではわからない状況です。

journalctlによるデーモンプロセスのエラーログ調査

ここで、 上記のsystemctl statusの出力結果にMain PID: ${PID}が表示されており、これが起動しようとしたプロセスIDになります。
journalctlコマンドを使うことで、systemctlによって起動するプロセスのエラーなどのログを確認することができます。

journalctl _PID=12345
-- Logs begin at ..... --
Mar 09 11:11:12 host sh[23467]: /bin/sh: /usr/java/default/bin/java: No such file or directory

こういう感じで実際のエラーの原因を知ることができました。