📝

CentOS7のsystemdでuserインスタンスを起動する

2022/09/22に公開

はじめに

root権限を持っていないユーザがプロセスをデーモン化しようとする場合、通常はsystemd --userインスタンスを利用する。ただしCentOS7を含むRHEL7系列のディストリビューションはsystemd --userインスタンス機能がデフォルトで削除されていて、この機能が利用できない。

$ systemctl --user status
Failed to get D-Bus connection: No such file or directory

設定方法

RHEL7系列のディストリビューションで非rootユーザがサービスを立ち上げるためには、事前にユーザセッションが起動されている必要がある。lingerを利用してシステムからあらかじめユーザセッションを起動しておけばよい。

$ cat << EOL | sudo tee /etc/systemd/system/user@.service
[Unit]
Description=User Manager for UID %i
After=systemd-user-sessions.service
After=user-runtime-dir@%i.service
Wants=user-runtime-dir@%i.service

[Service]
User=%i
PAMName=systemd-user
Type=notify
ExecStartPre=/bin/loginctl enable-linger %i
ExecStart=-/lib/systemd/systemd --user
PermissionsStartOnly=true
Slice=user-%i.slice
KillMode=mixed
Delegate=yes
TasksMax=infinity
Restart=always
RestartSec=15

[Install]
WantedBy=default.target
EOL

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now user@${UID}.service

root権限のないユーザがsystemd --userインスタンスを使うというお題目でいきなりsudoをたたいているが、ココだけはどうしても必要なのでしょうがない。[1]

以上で必要な準備が整った。
無事にuserインスタンスが起動できることを確認してみる。

$ systemctl --user status
● localhost.localdomain
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Thu 2022-09-22 00:33:09 UTC; 1s ago
   CGroup: /user.slice/user-1000.slice/user@1000.service
           ├─24268 /lib/systemd/systemd --user
           └─24271 (sd-pam)

ユーザサービスの起動テスト

試しに簡単なWebサービスをuserインスタンスで立ち上げてみよう。

$ mkdir -p ~/.config/systemd/user/
$ cat << EOL | tee ~/.config/systemd/user/fileserver.service
[Unit]
Description=User file server service

[Service]
ExecStart=/usr/bin/python -m SimpleHTTPServer 8080
Restart=always

[Install]
WantedBy=default.target
EOL

$ systemctl --user daemon-reload
$ systemctl --user enable --now fileserver.service
$ systemctl --user status fileserver.service
● fileserver.service - User service file
   Loaded: loaded (/home/vagrant/.config/systemd/user/fileserver.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2022-09-22 00:37:34 UTC; 4s ago
 Main PID: 24332 (python)
   CGroup: /user.slice/user-1000.slice/user@1000.service/fileserver.service
           └─24332 /usr/bin/python -m SimpleHTTPServer 8080

Sep 22 00:37:34 localhost.localdomain systemd[24268]: Started User file server service.

無事に起動できており、http://localhost:8080 にアクセスするとファイルサーバーにアクセス可能なことが確認できる。

脚注
  1. sudoコマンドが許可されていなければ、代理でシステム管理者に${UID}の部分をあなたのUIDに置き換えて、上記のコマンドを実行してもらおう ↩︎

Discussion