守护进程的 Systemd 单元文件在启动时不工作

守护进程的 Systemd 单元文件在启动时不工作

我正在尝试transmission-daemon使用 Raspberry Pi B 型启动systemd。我现在可以使用 停止和启动守护进程systemctl,但启动时自动启动尚未正常工作。

我已经创建了单元文件/etc/systemd/system/transmission.service

[Unit]
Description=Transmission daemon
Requires=network.target

[Service]
Type=forked
User=pi
ExecStart=/usr/bin/transmission-daemon -f

[Install]
WantedBy=multi-user.target

我已使用以下方式启用了该服务:

sudo systemctl enable transmission.service

不幸的是......重新启动时没有乐趣。但是,手动启动是有效的:

sudo systemctl start transmission.service

我究竟做错了什么?我使用的是最新的 Raspbian Jessie。

编辑 (2015/10/16)

根据ps aux和的输出systemctl status transmission.service,守护进程已启动并正在运行。但是,我无法访问网络界面。如果我停止正在运行的守护进程实例并手动重新启动它,那么我就可以访问 Web 界面。

根据要求,以下是重新启动 Pi 后ps aux的输出:netstat

https://dl.dropboxusercontent.com/u/29638164/ps_before.txt https://dl.dropboxusercontent.com/u/29638164/netstat_before.txt

以下是手动重新启动守护进程后的相同输出:

https://dl.dropboxusercontent.com/u/29638164/ps_after.txt https://dl.dropboxusercontent.com/u/29638164/netstat_after.txt

通过使用:

$ killall transmission-daemon
$ sudo systemctl start transmission.service

答案1

Requires=network.target告诉systemd我们该服务需要在某个时刻激活网络连接,但是未指定仅应启动此服务网络已启动

(是的,有些服务可以处理网络接口在服务运行时出现、重新配置和/或消失的情况。对于这些服务来说,Requires=network.target效果很好。在现代世界,随着热插拔和 IPv6 变得越来越普遍,也许更多的服务应该是这样的。)

systemd.unit(5)手册页(强调我的):

请注意,需求依赖性不会影响服务启动或停止的顺序。这必须使用After=Before= 选项独立配置。如果一个单元需要一个配置为 的foo.service单元,并且没有使用 或配置排序,则bar.serviceRequires=After=Before=两个装置将同时启动foo.service如果激活的话,它们之间没有任何延迟。通常,在处理失败的服务时,使用Wants=而不是为了实现更健壮的系统是更好的选择。Requires=

如果您想指定该服务仅在网络启动且所有接口都有其 IP 地址后启动,您应该执行以下操作:

Wants=network-online.target
After=network-online.target

systemd.special(7)手册页:

network-online.target

严格需要配置网络连接的单元应该拉入network-online.target(通过Wants=类型依赖)并在其之后自行排序。该目标单元旨在拉入延迟进一步执行的服务,直到网络充分建立为止。具体需要什么,就留给网络管理服务的实现吧。

答案2

Transmission-daemon 无法绑定端口,因为网络接口尚未获得 IP 地址。假设 IP 地址为 192.168.xxx.xxx,可以通过使用以下命令向 Transmission-daemon systemd 单元添加 ExecStartPre 选项来解决该问题

ExecStartPre=/usr/bin/timeout 120 sh -c "until ifconfig | grep -m 1 '192\.168'; do sleep 1 ; done"

可以找到更多详细信息这里

相关内容