为什么我的 systemd 用户单元不在启动时启动?

Mic*_*ton 60 fedora systemd not-root-user services

我正在尝试创建一个 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.
Run Code Online (Sandbox Code Playgroud)

尽管运行此命令,但我的服务并未在启动时启动。

loginctl enable-linger error
Run Code Online (Sandbox Code Playgroud)

那个单位:

$ 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
Run Code Online (Sandbox Code Playgroud)

当我重新启动时,它没有运行:

$ 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.
Run Code Online (Sandbox Code Playgroud)

我可以手动启动它,它可以工作:

$ 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"
Run Code Online (Sandbox Code Playgroud)

我如何弄清楚为什么这个服务没有在启动时启动,并让它这样做?

操作系统为 Fedora 23 x86_64,systemd 222-10。

Mic*_*ton 90

数字我会自己解决这个问题。

线索就在这里,在用户服务输出中:

Dec 23 19:43:27 redmine systemd[613]: Reached target Default.
Run Code Online (Sandbox Code Playgroud)

我的单元要求加载multi-user.target,但用户 systemd 中没有这样的目标。

default.target在单元文件中将其更改为,禁用并重新启用该服务,现在它在启动时启动。

[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)

进而

$ 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.
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!使用 `systemctl --user list-units --type=target` 列出用户 systemd 的目标。 (13认同)
  • 另外,一定要运行`loginctl enable-linger USERNAME`,否则服务将在`user login`而不是`boot`上启动。我知道 OP 在问题中提到了它,但我花了一段时间才弄明白,所以我也在这里发布它,以防它对任何人有所帮助。 (3认同)
  • 伟大的。谢谢!我的用户单位也依赖 multi-user.target ...... (2认同)