🤮
自作systemd serviceファイルがActivatingのままになる場合の対処
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 より引用しました。 Type=forking
の場合、 PIDの通知を持ってそのサービスがActiveになったと判断します。逆にいうと、PIDの通知がなければ(=PIDファイルが作られなければ)Activatingのままスタックしてしまいます。
自作サービスをPIDファイルの書き出し先の設定ができるようにしていたりする場合、特にハマりやすいので注意です。
Debug時のTips
蛇足の蛇足みたいなものですが、systemdのサービスのデバッグをする場合は、以下のページが参考になりました。
特になんか動かない・・・という場合には以下で一つずつ見ていくことをお勧めします。
sudo runuser -l USER --group=GROUP -c "cd WD && ENVFILE_CONTENTS ENV COMMAND"
Discussion