alfort's Blog

Linuxエンジニアのメモ

起動時に一般ユーザー権限のサービスを起動する

systemd --userを使うことでroot権限が必要ないサービスやタイマーを非root権限のユーザーがroot権限なしに設定することができる。

ただし、システムのサービスと異なり起動時にサービスは起動してくれない。 ユーザーのセッションが存在するとき(私の場合はsshサーバーとして利用しているので、自分がサーバーにログインしているとき)にしか動作してくれない。

サーバーの起動時にsshでログインするより前に作図したいことだってあるだろうし、タイマー関連の操作はログインしているかどうかにかかわらず指定した時刻に動作してほしい。

今回はそういった場合にどうすればいいのかを調べてまとめた話。

こういったときには、loginctlを使って設定を行っておくとユーザーセッションのありなしにかかわらずサーバーが起動したときにユーザーが設定したサービスを立ち上げることができる。

まずは以下のように、Lingerの項目がnoになっていることを確認する。

$ loginctl user-status
XXXXXX (1000)
           Since: Mon 2023-04-17 09:49:57 JST; 1h 44min ago
           State: active
        Sessions: 6 5 *1
          Linger: no   <---
            Unit: user-1000.slice
...

次に、以下のコマンドでユーザーセッションのありなしに関わらずサービスを立ち上げるよう指示する。

$ loginctl enable-linger

最後にもう一度、Lingerの箇所がyesになっていることを確認する。

$ loginctl user-status | head
XXXXXX (1000)
           Since: Mon 2023-04-17 09:49:57 JST; 1h 43min ago
           State: active
        Sessions: 6 5 *1
          Linger: yes    <---
            Unit: user-1000.slice
...

これで再起動などをかけた後に、サービスがきちんと起動しているはず。