从 systemd 服务中调用时,bash 脚本中的“route add/del”不起作用

从 systemd 服务中调用时,bash 脚本中的“route add/del”不起作用

我有一个使用路由命令来添加或删除网络路由的脚本。如果我从终端作为常规脚本运行它,它就可以正常工作。

不过,我尝试自动执行它,以便它在启动时使用 systemd 一次性服务运行。

我已经创建了该服务,一切似乎都运行良好,任何地方都没有抱怨,没有我可以在任何地方观察到的错误代码或消息,但是该路线既没有添加也没有删除。

我怀疑 systemd 在运行“route add/del”时施加了某种限制,但无法弄清楚它是什么。

我运行的是 CentOS 7,因此无法在 ExecStart、ExecStop 中添加“+”。

我试图设置 KillMode=None(以允许从脚本内部分叉,我知道这是不建议的)但没有帮助。

我制作了一个仅添加/删除路线的脚本版本,出于测试目的,我已将脚本简化为几乎一行,执行“route add”/“route del”来解决此问题,我可以说 100 % 问题在于运行“route add/del”,而不是脚本中的其他内容运行 systemd。

我不知道如何继续,如果有人可以提供一些见解或调试方法,那就太好了。

这是我的服务定义,没有什么异常:

[Unit]
Description=Add/remove network X
After=network-online.target

[Service]
Type=oneshot
KillMode=none
ExecStart=/usr/local/bin/script.sh --start
ExecStop=/usr/local/bin/script.sh --stop

[Install]
WantedBy=multi-user.target

注意:我知道“systemd-networkd”可以创建网络路由,但这不是我想要的,因为该脚本除了添加或删除网络路由之外还做了很多事情。

答案1

好的,找到问题所在,如果服务类型是 oneshot ,则需要添加到它:RemainAfterExit=yes否则,当您运行时似乎会发生的systemctl start <service>ExecStartrun 然后ExecStop。脚本运行良好,并且使用 添加路线ExecStart,然后使用 删除路线ExecStop

在我的用例中使用是有意义的,RemainAfterExit=yes因为服务的用例是更改系统状态,如 systemd 文档中所述

然而我不知道这种在whenExecStop之后运行的行为是否是CentOS7中的一个错误或预期行为,我无法在Systemd文档中找到详细的解释(或者我可能错过了它)。ExecStartRemainAfterExit=no

相关内容