我正在尝试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.service
Requires=
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"
可以找到更多详细信息这里