Fedora

為什麼我的 systemd 使用者單元在啟動時不啟動?

  • November 5, 2020

我正在嘗試創建一個 systemd 使用者單元並在系統啟動時啟動它。該服務確實手動啟動,但它不會在啟動時啟動。

通過搜尋網際網路,我了解到為了讓使用者單元在啟動時啟動,我應該需要執行loginctl enable-linger <username>,但這似乎根本沒有任何效果。事實上,手冊頁說:

       Enable/disable user lingering for one or more users. If enabled for
       a specific user, a user manager is spawned for the user at boot and
       kept around after logouts. This allows users who are not logged in
       to run long-running services.

儘管執行了這個命令,我的服務並沒有在啟動時啟動。

loginctl enable-linger error

那個單位:

$ cat ~/.config/systemd/user/thin\@.service
[Unit]
Description=A fast and very simple Ruby web server

[Service]
Type=simple
EnvironmentFile=/home/error/.config/thin/%i
ExecStart=/usr/bin/bash /home/error/.rvm/wrappers/%i/thin start -a $THIN_BIND -p $THIN_PORT
WorkingDirectory=/srv/www/%i
PrivateTmp=true

[Install]
WantedBy=multi-user.target

當我重新啟動時,它沒有執行:

$ systemctl --user status thin@redmine -l
● thin@redmine.service - A fast and very simple Ruby web server
  Loaded: loaded (/home/error/.config/systemd/user/thin@.service; enabled; vendor preset: enabled)
  Active: inactive (dead)

# systemctl status user@1000 -l
● user@1000.service - User Manager for UID 1000
  Loaded: loaded (/usr/lib/systemd/system/user@.service; static; vendor preset: disabled)
  Active: active (running) since Wed 2015-12-23 19:43:27 GMT; 13s ago
Main PID: 613 (systemd)
  Status: "Startup finished in 38ms."
  CGroup: /user.slice/user-1000.slice/user@1000.service
          ├─613 /usr/lib/systemd/systemd --user
          └─615 (sd-pam)                                                          

Dec 23 19:43:27 redmine systemd[613]: Reached target Sockets.
Dec 23 19:43:27 redmine systemd[613]: Starting Sockets.
Dec 23 19:43:27 redmine systemd[613]: Reached target Timers.
Dec 23 19:43:27 redmine systemd[613]: Starting Timers.
Dec 23 19:43:27 redmine systemd[613]: Reached target Basic System.
Dec 23 19:43:27 redmine systemd[613]: Starting Basic System.
Dec 23 19:43:27 redmine systemd[613]: Reached target Default.
Dec 23 19:43:27 redmine systemd[613]: Startup finished in 38ms.
Dec 23 19:43:27 redmine systemd[613]: Starting Default.
Dec 23 19:43:27 redmine systemd[1]: Started User Manager for UID 1000.

我可以手動啟動它,它可以工作:

$ systemctl --user start thin@redmine
$ systemctl --user status thin@redmine -l
● thin@redmine.service - A fast and very simple Ruby web server
  Loaded: loaded (/home/error/.config/systemd/user/thin@.service; enabled; vendor preset: enabled)
  Active: active (running) since Wed 2015-12-23 19:43:50 GMT; 5s ago
Main PID: 1265 (ruby)
  CGroup: /user.slice/user-1000.slice/user@1000.service/thin.slice/thin@redmine.service
          └─1265 ruby /home/error/.rvm/gems/ruby-2.2.1@redmine/bin/thin start -a ::1 -p 8008

Dec 23 19:43:50 redmine systemd[613]: Started A fast and very simple Ruby web server.
Dec 23 19:43:50 redmine systemd[613]: Starting A fast and very simple Ruby web server...
Dec 23 19:43:52 redmine bash[1265]: /home/error/.rvm/gems/ruby-2.2.1@redmine/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb:465: warning: duplicated key at line 466 ignored: "inodot"

# systemctl status user@1000 -l
● user@1000.service - User Manager for UID 1000
  Loaded: loaded (/usr/lib/systemd/system/user@.service; static; vendor preset: disabled)
  Active: active (running) since Wed 2015-12-23 19:43:27 GMT; 40s ago
Main PID: 613 (systemd)
  Status: "Startup finished in 38ms."
  CGroup: /user.slice/user-1000.slice/user@1000.service
          ├─613 /usr/lib/systemd/systemd --user
          ├─615 (sd-pam)                                                       
          └─thin.slice
            └─thin@redmine.service
              └─1265 ruby /home/error/.rvm/gems/ruby-2.2.1@redmine/bin/thin start -a ::1 -p 8008                                                               

Dec 23 19:43:27 redmine systemd[613]: Startup finished in 38ms.
Dec 23 19:43:27 redmine systemd[613]: Starting Default.
Dec 23 19:43:27 redmine systemd[1]: Started User Manager for UID 1000.
Dec 23 19:43:50 redmine systemd[613]: Created slice -.slice.
Dec 23 19:43:50 redmine systemd[613]: Starting -.slice.
Dec 23 19:43:50 redmine systemd[613]: Created slice thin.slice.
Dec 23 19:43:50 redmine systemd[613]: Starting thin.slice.
Dec 23 19:43:50 redmine systemd[613]: Started A fast and very simple Ruby web server.
Dec 23 19:43:50 redmine systemd[613]: Starting A fast and very simple Ruby web server...
Dec 23 19:43:52 redmine bash[1265]: /home/error/.rvm/gems/ruby-2.2.1@redmine/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb:465: warning: duplicated key at line 466 ignored: "inodot"

我如何弄清楚為什麼該服務沒有在啟動時啟動,並讓它這樣做?

作業系統是 Fedora 23 x86_64,systemd 222-10。

我自己想出來的數字。

線索就在這裡,在使用者服務輸出中:

Dec 23 19:43:27 redmine systemd[613]: Reached target Default.

我的單位要求載入multi-user.target,但使用者 systemd 中沒有這樣的目標。

我將其更改為default.target在單元文件中,禁用並重新啟用該服務,它現在在啟動時啟動。

[Install]
WantedBy=default.target

進而

$ systemctl --user disable thin@redmine
Removed symlink /home/error/.config/systemd/user/multi-user.target.wants/thin@redmine.service.
$ systemctl --user daemon-reload
$ systemctl --user enable thin@redmine
Created symlink from /home/error/.config/systemd/user/default.target.wants/thin@redmine.service to /home/error/.config/systemd/user/thin@.service.

引用自:https://unix.stackexchange.com/questions/251211