systemd 用户服务不会在用户登录时自动运行

vds*_*shb 6 debian systemd

我有 Debian Jessie 并通过 ssh 连接到它。我想在 systemd 用户登录时自动启动 shell 命令。

我创建了一个简单的 systemd 服务~/.config/systemd/user/foo.service女巫,其中包含:

[Unit]
Description=Systemd autostart test
Wants=local-fs.target
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo 123 >> /home/user/there;"

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我已经通过 systemctl 启用它

systemctl --user enable foo
Run Code Online (Sandbox Code Playgroud)

我已经创建了成功消息容器

touch ~/there
Run Code Online (Sandbox Code Playgroud)

并在重新启动和登录(通过 ssh)后~/there文件为空。

当我手动使用它时

systemctl --user restart foo
Run Code Online (Sandbox Code Playgroud)

有用。

我错过了什么?

Mic*_*ton 5

默认情况下,用户无法将用户服务设置为在引导时运行。管理员必须为每个用户单独启用此功能。

sudo loginctl enable-linger <username>
Run Code Online (Sandbox Code Playgroud)

文档

为一个或多个用户启用/禁用用户延迟。如果为特定用户启用,则会在启动时为用户生成用户管理器,并在注销后保留。这允许未登录的用户运行长时间运行的服务。将一个或多个用户名或数字 UID 作为参数。如果未指定参数,则为调用者会话的用户启用/禁用延迟。

您还需要像 Climenty 在另一个答案中解释的那样为 WantedBy= 设置正确的目标。在不存在用户服务; 默认情况下只有.multi-user.targetdefault.target

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


小智 2

尝试这个

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