如何通过特定用户运行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/
因为各种bin
和lib
文件夹尚未合并为统一文件夹/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
来管理和配置服务,这些服务将在您的用户服务管理器上运行,而不是在系统上运行。