📝
CentOS7のsystemdでuserインスタンスを起動する
はじめに
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 にアクセスするとファイルサーバーにアクセス可能なことが確認できる。
-
sudoコマンドが許可されていなければ、代理でシステム管理者に
${UID}
の部分をあなたのUIDに置き換えて、上記のコマンドを実行してもらおう ↩︎
Discussion