网络通后启动systemd服务

网络通后启动systemd服务

这是我第一次不得不摆弄 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 启动时尚未准备好,因此网络有时间启动接口。

相关内容