我正在调试防火墙 .service 单元,出现了一些问题。
其中一个问题是该单位的最佳服务类型,无论是 exec 还是 oneshot。在我的搜索中几乎没有出现两者的比较,可能是因为 exec 是 systemd (v.249 IIRC) 的一个相对较新的添加。
作为背景,该单元(称为 iptables.service)旨在通过在网络启动之前(即network-pre.target 之前)运行 Bash 脚本(称为 iptables.sh)来激活和配置防火墙,例如,
ExecStart=/bin/bash -c '/home/locsh/iptables.sh'
Type=oneshot具有不进入“活动”状态的优点,因此它随后可以被重新启动或重新激活,例如,通过计时器单元。在大多数示例中,它也是这两种类型中更常见的一种,尽管没有解释。
type=exec的好处是会延迟后续单元的启动,直到主服务执行完毕。这似乎对防火墙 .service 单元非常有意义,因为网络应该依赖于成功运行的脚本并保持关闭,例如,如果由于某种原因相关的 .mount 单元尚未激活而暂时无法读取脚本.
在任何一种情况下, Restart=on-failure似乎都是一个明显而谨慎的补充。
第一个问题是,无论出于何种原因,其中一个是否会更好。
第二个问题是 Type=exec 是否会因为延迟后续单元的启动而在某些边缘情况下引入微妙的排序周期,无论是否有“Restart=on-failure”,部分原因是单元的排序依赖性
Before=network-pre.target
在引导过程中相对较早。
你想要
type=oneshot
。如果您使用type=exec
,则在配置防火墙之前,其他服务将能够启动。从systemd.service
手册页中,对于exec
:对于
oneshot
:换句话说,with
Type=exec
,systemd
认为服务在进程成功启动后“启动” ,而 forType=oneshot
,systemd
认为服务在进程成功完成后“启动” 。