如何让我的 systemd 服务通过特定用户运行并在启动时启动?

voi*_*ter 197 systemd

我刚刚从 Ubuntu 服务器 14 升级到版本 15。升级后我无法让我的 upstart 脚本工作,并且读到 systemd 是新的默认值。我远非 Linux 专家,所以请放轻松 :-)

这是我之前的新贵脚本:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script
Run Code Online (Sandbox Code Playgroud)

基于systemd wiki 页面暴发户,我使用那里提供的表格在我的新 systemd 服务文件中尽可能地映射事物:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure
Run Code Online (Sandbox Code Playgroud)

该文件位于/home/robert/.config/systemd/user/nzbget.service. 要手动启动服务,我一直在做:

$ systemctl --user start nzbget
Run Code Online (Sandbox Code Playgroud)

这很好用。但是,当我退出 SSH 会话时,该服务将关闭。此外,它不会在启动或用户登录时启动。我希望它的行为与作为新贵服务的行为相同:我希望它在启动时启动,不断运行,并作为特定用户。

我需要做什么才能获得此配置?

Yam*_*aho 254

第一个问题

您可以在单元文件的部分中指定指令User=和。Group=[Service]

第二个问题

要使服务在启动时运行,您不应将它放在您的主文件夹中。相反,将它放在/etc/systemd/system/. 这是系统管理员(即您)用来添加新的系统范围服务的文件夹。

其他文件夹包括:

  • /usr/lib/systemd/system/用于要安装单元文件的包,尽管在 Debian 和 Ubuntu 下,该文件夹实际上是/lib/systemd/system/因为各种binlib文件夹尚未合并为统一/usr/前缀。
  • /usr/local/lib/systemd/system/ 用于通过本地编译的包安装单元。

测试单元

一旦单元文件位于适当的位置,您可以systemctl start <UNIT_FILENAME>像往常一样通过键入立即尝试启动单元。它应该可以工作,而无需键入单元的完整路径。如果扩展名是.service.

启用本机

在启用您的单元之前,您需要添加一个[Install]部分,您应该在该部分下添加指令WantedBy=multi-user.target。该指令指定启动过程的阶段,在该阶段应该启动服务(如果已启用)。multi-user.target适用于大多数服务。

添加该信息后,您可以使用systemctl enable <UNIT_FILENAME>,它启用该单元,使 systemd 从现在开始在指定阶段的启动过程中自动启动它。

  • 当用户名被模板化时,这变得容易得多,即您的服务使用格式为`something@.service`的文件名定义然后`启用`d like `something@username.service`,设置变为`User=%i`的意思用户不是硬编码的,多个用户可以使用相同的定义。[一个例子。](https://github.com/joeroback/dropbox) (7认同)
  • 对于长时间无人看管的答案,我深表歉意。我修复了单元文件应该去的位置,添加了关于“[Install]”部分的缺失信息。希望它现在对寻找它的人更有帮助。 (4认同)
  • @fbicknel - 根据 Arch 发行版,这是不正确的:https://wiki.archlinux.org/index.php/Systemd/User "`/etc/systemd/user/` **其中系统范围的用户单元由系统管理员。**”(并不是说这里一定有一个普遍的真理值......我只是想以最直接的方式为自己做到这一点) (3认同)
  • `Install` 警告实际上非常重要。如果没有 `[Install]` 部分下的 `WantedBy=multi-user.target`,它不会在启动时启动。将此添加到`.service` 文件后,*然后* 您可以“启用”它。 (2认同)
  • 如果我把它放在 `/etc/systemd/user/` 下,它会启动吗? (2认同)
  • 你的单元文件属于`/usr/local/lib/systemd/system`,你运行`systemctl enable [service]`,它将它们链接到`/etc/systemd/system`。你不应该*应该*把文件放在`/etc/systemd/system`中。请参阅:`man systemd` 并查看 **DIRECTORIES** (2认同)

byt*_*org 79

您可能对使用 systemd 的用户延迟功能感兴趣。它通过loginctl enable-linger USERNAME.

它会导致在启动时为各个用户启动一个单独的服务管理器,因此您的用户定义单元~/.config/systemd/user将根据您的服务配置在启动和关闭时间被选取和处理。

您还可以systemctl --user用于管理和配置服务,这些服务将在您用户的服务管理器上运行,而不是在系统上运行。

  • `systemctl --user` 是一个很棒的发现。谢谢! (7认同)
  • 请注意,`systemctl --user` 似乎不适用于 SSH 会话。 (3认同)