问题描述
我刚刚从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/
,因为各种bin
和lib
文件夹尚未合并为统一的/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
来管理和配置服务,这些服务将在您的用户服务管理器上运行,而不是在系统上运行。