当前位置: 首页>>技术教程>>正文


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

ubuntuer 技术教程 , 去评论

问题描述

我刚刚从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

基于upstart to systemd wiki page,我使用那里提供的表格在我的新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服务的行为相同:我希望它在启动时启动,不断运行,并作为特定用户。

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

最佳解决方法

第一个问题

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

第二个问题

要使服务在引导时运行,不应将其放在主文件夹中。相反,将它放在/etc/systemd/system/下。这是系统管理员(即您)用于添加新system-wide服务的文件夹。

其他文件夹包括:

  • /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。该指令指定boot-up进程的阶段,在此阶段应启动服务(如果已启用)。 multi-user.target适用于大多数服务。

添加该信息后,您可以使用systemctl enable <UNIT_FILENAME>来启用该设备,从现在起使systemd在指定阶段启动时自动启动它。

次佳解决方法

您可能对使用systemd的”user lingering”功能感兴趣。它通过loginctl enable-linger USERNAME启用。

它会导致在启动时启动相应用户的单独服务管理器,因此将根据您的服务配置在启动和关闭时选择并处理~/.config/systemd/user中的用户定义单元。

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1199.html,未经允许,请勿转载。