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

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

我刚刚从 Ubuntu 服务器 14 升级到版本 15。升级后,我无法让 upstart 脚本正常工作,并且看到 systemd 是新的默认设置。我远非 Linux 专家,所以请对我宽容一点 :-)

以下是我之前的 upstart 脚本:

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

根据upstart 到 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

此文件位于/home/robert/.config/systemd/user/nzbget.service。要手动启动服务,我一直在执行以下操作:

$ systemctl --user start nzbget

这很好用。但是,当我退出 SSH 会话时,服务会关闭。此外,它不会在启动或用户登录时启动。我希望它的行为与 upstart 服务相同:我希望它在启动时启动、持续运行并以特定用户身份运行。

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

答案1

第一个问题

您可以在单元文件的部分中指定指令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 从现在开始在指定阶段启动时自动启动它。

答案2

你可能对使用 systemd 感兴趣用户徘徊功能。它通过 启用loginctl enable-linger USERNAME

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

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

相关内容