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


132

我刚从Ubuntu服务器14升级到版本15。升级后,我的新贵脚本无法正常工作,并且读到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

基于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会话时,该服务将关闭。此外,它不会在启动或用户登录时启动。我希望它的行为与作为新贵服务的行为相同:我希望它在引导时启动,持续运行并以特定用户身份运行。

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

Answers:


163

第一个问题

您可以指定指令User=,并Group=[Service]该单位文件的部分。

第二个问题

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

其他文件夹包括:

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

测试单元

单元文件放在适当的位置后,您可以尝试systemctl start <UNIT_FILENAME>照常键入立即尝试启动单元。它无需输入设备的完整路径即可工作。如果扩展名也不必指定.service

启用设备

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

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


这工作了。虽然我必须在命令中指定服务文件名的绝对路径,systemctl enable但起初对我来说这并不明显。同时启用也给我一些关于缺少[Install]部分的警告。我忽略了它,但是我不确定它是否会影响它在启动时启动的能力。
void.pointer 2015年

2
Install警告实际上非常重要。没有WantedBy=multi-user.target[Install]部分的内容,它将无法在启动时启动。这增加的后.service文件,那么就可以enable了。
void.pointer 2015年

4
对于这么长的时间无人问津,我深表歉意。我固定了单元文件应存放的位置,并添加了有关该[Install]部分的缺失信息。希望它现在对任何寻找它的人都有帮助。
Yamaho

5
当使用用户名进行模板化时,这将变得更加容易,例如,使用文件名定义您的服务,something@.service然后使用以下格式:enabled就像something@username.service该设置一样,User=%i意味着用户没有经过硬编码,并且多个用户可以使用相同的定义。一个例子。
沃尔夫'17

1
如果放下它会开始/etc/systemd/user/吗?
库尔希德·阿拉姆

46

您可能对使用systemd的“用户挥之不去”功能感兴趣。通过启用loginctl enable-linger USERNAME

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

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


6
systemctl --user是一个了不起的发现。谢谢!
安瓦尔

@byteborg也许您可以为unix.stackexchange.com/questions/409900/…做出贡献?我需要在用户延迟服务中依赖PostgreSQL,但是数据库仍然是系统服务,而不是用户的服务。
米哈尔˚F

1
服务运行后,是否有任何技术可以使用户查看服务日志?没有特权的用户将无法访问/ var / log / syslog。
mpr

2
请注意,systemctl --user这似乎不适用于SSH会话。
Mark K Cowan '18

2
应该是公认的解决方案
德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.