我刚刚从 Ubuntu 服务器 14 升级到版本 15。升级后,我无法让 upstart 脚本正常工作,并且看到 systemd 是新的默认设置。我远非 Linux 专家,所以请对我宽容一点 :-)
以下是我之前的 upstart 脚本:
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 到 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 服务相同:我希望它在启动时启动、持续运行并以特定用户身份运行。
我需要做什么才能获得此配置?
答案1
第一个问题
您可以在单元文件的部分中指定指令User=
和。Group=
[Service]
第二个问题
要使服务在启动时运行,您不应将其放在主文件夹中。相反,应将其放在 下/etc/systemd/system/
。这是供系统管理员(即您)添加新的系统范围服务的文件夹。
其他文件夹包括:
/usr/lib/systemd/system/
适用于想要安装单元文件的软件包,但在 Debian 和 Ubuntu 下,该文件夹实际上是,/lib/systemd/system/
因为各种bin
和lib
文件夹尚未合并为统一的/usr/
前缀。/usr/local/lib/systemd/system/
用于通过本地编译的包安装单元。
测试单元
一旦单元文件位于适当的位置,您就可以尝试通过systemctl start <UNIT_FILENAME>
照常键入来立即启动该单元。它应该可以工作,而不必键入单元的完整路径。如果扩展名是 ,则也不必指定.service
。
启用单位
在启用单元之前,您需要添加一个[Install]
部分,在该部分下应添加指令WantedBy=multi-user.target
。该指令指定启动过程的哪个阶段,在此阶段应启动服务(如果已启用)。multi-user.target
适用于大多数服务。
添加该信息后,您可以使用systemctl enable <UNIT_FILENAME>
,启用该单元,使 systemd 从现在开始在指定阶段启动时自动启动它。
答案2
你可能对使用 systemd 感兴趣用户徘徊功能。它通过 启用loginctl enable-linger USERNAME
。
它会在启动时为相应的用户启动一个单独的服务管理器,因此您的用户定义的单元~/.config/systemd/user
将根据您的服务配置在启动和关闭时被拾取和处理。
您还可以使用它systemctl --user
来管理和配置服务,这些服务将在用户的服务管理器上运行,而不是系统的服务管理器。