🤮

自作systemd serviceファイルがActivatingのままになる場合の対処

2024/11/17に公開

TL;DR

systemd の Type=forking は Activated になったことを PIDFile の有無で判断するので注意。

蛇足の説明

上で書いてある通りです。自作のサービスをsystemdで動かす場合、以下のような unit ファイルを用意して実施しますよね。

[Unit]
Description=My Awesome Service

[Service]
Type=forking
PIDFile=/run/my_awesome_service
ExecStart=/usr/bin/my_awesome_service start
ExecStop=/usr/bin/my_awesome_service stop

[Install]
WantedBy=multi-user.target

こういう場合、 My Awesome Service がちゃんと PIDFile にpidファイル(service自身のPIDを記したファイル)が出力されることを確認しないといけない、という話です。

https://rheb.hatenablog.com/entry/systemd-service-strace より引用

画像は https://rheb.hatenablog.com/entry/systemd-service-strace より引用しました。 Type=forking の場合、 PIDの通知を持ってそのサービスがActiveになったと判断します。逆にいうと、PIDの通知がなければ(=PIDファイルが作られなければ)Activatingのままスタックしてしまいます。

自作サービスをPIDファイルの書き出し先の設定ができるようにしていたりする場合、特にハマりやすいので注意です。

Debug時のTips

蛇足の蛇足みたいなものですが、systemdのサービスのデバッグをする場合は、以下のページが参考になりました。

https://documentation.suse.com/smart/systems-management/html/task-debug-failed-systemd-services/index.html

特になんか動かない・・・という場合には以下で一つずつ見ていくことをお勧めします。

sudo runuser -l USER --group=GROUP -c "cd WD && ENVFILE_CONTENTS ENV COMMAND"

Discussion