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
こういう感じで実際のエラーの原因を知ることができました。