如何通过特定用户运行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 

基于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服务的行为相同:我希望它在启动时启动,不断运行,并作为特定用户。

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

第一个问题

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

第二个问题

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

其他文件夹包括:

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

测试单位

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

启用本机

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

添加该信息后,您可以使用systemctl enable ,它启用该单元,从现在起使systemd在指定阶段启动时自动启动它。

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

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

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