我有一个 systemctl 服务ip route add
,带有ifconfig
、arp
和ethtool
命令来动态配置 2 个接口。不知何故,几秒/分钟或随机后,配置就消失了(IP 不再分配,路由和 arp 条目消失)。
我该如何调试这个问题以及为什么我的设置消失了?
[Unit]
After=network-online.target
[Service]
ExecStart=/usr/local/bin/routingsf.sh enp4s0f0 enp4s0f1
[Install]
WantedBy=network-online.target
我有很多 sh*** 进程,例如Avahi-daemon
发送数据包进行广播,即使我不想这样做。这些接口用于测试目的,我不希望通过这些接口发送不需要的数据包。
答案1
如果您的和接口列 中nmcli device status
有,则意味着 NetworkManager 正在接管它们。disconnected
STATE
enp4s0f0
enp4s0f1
请以 root 身份运行以下命令:
nmcli device set enp4s0f0 managed no
nmcli device set enp4s0f1 managed no
告诉 NetworkManager 不要把手放在这些设备上。这应该可以解决你的问题。通常 NetworkManager 应自动存储这些设置,以便它们在重新启动后仍然存在,但这可能取决于您使用的 Linux 发行版。
此后,nmcli device status
这些网络接口的状态应显示为unmanaged
,表示您可以自由地手动配置这些接口,而不受 NetworkManager 的任何干扰。
还有一个对您的 systemd 服务的挑剔:如果您routingsf.sh
不包含任何永久运行的内容,而只是“设置一次并完成”类型的命令,例如ip route add
、ifconfig
和arp
,ethtool
您可能需要在[Service]
服务文件的部分添加两行:
Type=oneshot
RemainAfterExit=yes
如果您不指定服务类型,systemd 将假定Type=simple
,这意味着启动的进程ExecStart=
预计将永远运行,直到故意停止。如果您routingsf.sh
不这样做,systemd 将注意到您的 ExecStart 命令退出,并将服务标记为失败。
Type=oneshot
+的组合RemainAfterExit=yes
告诉 systemd 您的脚本预计会执行一些操作然后退出,并且如果脚本成功退出,则 systemd 应该将您的服务状态显示为“正在运行”。ExecStop=
如果您想要一种简单的方法来使用标准命令关闭和打开这些设置systemctl
,那么您将可以选择添加相应的选项。