这是我第一次不得不摆弄 systemd。我找不到如何管理的解决方案,我的服务在网络启动后启动。我尝试knockd.service
在我的 Raspbian 系统上启动。
启动后,我检查服务是否正在运行:
systemctl status knockd
Loaded: loaded (/lib/systemd/system/knockd.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2019-06-27 14:36:26 CEST; 7min ago
Docs: man:knockd(1)
Process: 516 ExecStart=/usr/sbin/knockd $KNOCKD_OPTS (code=exited, status=1/FAILURE)
Main PID: 516 (code=exited, status=1/FAILURE)
Jun 27 14:36:26 pins2 systemd[1]: Started Port-Knock Daemon.
Jun 27 14:36:26 pins2 knockd[516]: could not get IP address for eth0
Jun 27 14:36:26 pins2 systemd[1]: knockd.service: Main process exited, code=exited, status=1/FAILURE
Jun 27 14:36:26 pins2 systemd[1]: knockd.service: Unit entered failed state.
Jun 27 14:36:26 pins2 systemd[1]: knockd.service: Failed with result 'exit-code'.
我认为问题是这样的:
could not get IP address for eth0
在我调查了很多之后(比如这里和那里)我发现了一些很好的提示,但不幸的是它仍然不起作用。我的.service
文件如下所示:
systemctl cat knockd
# /lib/systemd/system/knockd.service
[Unit]
Description=Port-Knock Daemon
Documentation=man:knockd(1)
#Requires=network-online.target
#Wants=network-online.target
After=network-online.target
[Service]
EnvironmentFile=-/etc/default/knockd
ExecStart=/usr/sbin/knockd $KNOCKD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
SuccessExitStatus=0 2 15
ProtectSystem=full
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN
[Install]
WantedBy=multi-user.target
Alias=knockd.service
我已经使用了After=network-online.target
在我的单元部分。我已经尝试过Requires=
了,我还需要做什么Wants=
?
启动后我的系统有一个 IP 地址,并且手动启动服务可以正常工作。在另一个具有更快网络的网络上,即使没有目标,我也没有任何问题network-online
。
正如你可以想象的那样,敲击可靠地启动是非常重要的,因为如果没有,我就被锁在外面了。
如果这工作可靠,如果在启动后一段时间连接网络电缆,这也能工作吗?
顺便说一句,我知道我不应该编辑该.service
文件,/lib/systemd/...
我只是这样做来解决可能的覆盖问题。一切正常后我会解决这个问题。感谢您的帮助。
答案1
您需要该Wants=
指令,因为network-online.target
默认情况下不会将其拉入依赖链(请参阅 systemd.special(7) 联机帮助页)。
ifupdown-wait-online.service
如果您不使用 NetworkManager,您可能还需要启用(systemctl enable ifupdown-wait-online.service)
答案2
@Bigon 有正确的总体想法。
这里的核心问题是network-online.target
通常不会被拉入 systemd 的依赖关系树中。当 systemd 处理After=network-online.target
您的单元中的行时,它确定可以忽略它,因为network-online.target
这不会发生。
您需要的是一个单元,该单元可以在网络 ::drum roll:: online 时将 network-online.target 拉入依赖树。许多发行版都提供这样的单元。网络管理器也经常提供此功能。
由于我不知道您的发行版,因此我很难知道要告诉您启用哪个单元。并且,在切换到网络管理器时将要可能会解决您的问题网络管理器也会对您的系统工作方式进行许多其他更改,可能与现有配置发生冲突。
答案3
只需安装网络管理器就可以在 Rasbian 上正常工作。
网络管理器允许 NetworkManager-wait-online.service。由于接口在 kockd 启动时尚未准备好,因此网络有时间启动接口。