我有一个设置一些 iptables 规则的脚本 ( /bin/myrules
)。
我使用这个单元文件通过 systemd 启动它myrules.service
:
[Unit]
Description=My Rules
[Service]
Type=oneshot
ExecStart=/sbin/myrules start
ExecStop=/sbin/myrules stop
RemainAfterExit=no
[Install]
WantedBy=multi-user.target
我想让 systemd 知道,在脚本执行并退出后,服务是“活动的”(如果 iptables 规则设置正确)。
我的脚本已经能够检查 iptables 规则的状态。跑步 :
/bin/myrules status
如果一切正常,将返回 0 退出代码。如果有错误,会返回1。
是否可以使systemctl status myrule
命令调用我的特定脚本来检查状态是否正常并相应地返回消息?
编辑:我需要systemctl status myrules
显示类似的东西
Active: active (whatever)
[编辑2] 但如果任何规则发生任何修改iptables
,应该重新检查如果所有规则都处于活动状态,然后显示
Active: inactive (whatever)
仅当它运行myrules status
以检查服务状态时,这才是可能的。
PS:我不需要更多有关 iptables 的信息,我使用 -C 选项来检查
答案1
对于 oneshot 类型,systemd 将运行该进程,一旦返回,就认为该进程已完成并返回到非活动状态,或者即使RemainAfterExit=yes
在进程退出后仍保持服务活动。
如果你的ExecStart
脚本成功地改变了 iptables 配置,它应该成功exit 0
,如果失败它应该exit 1
。成功使用该RemainAfterExit=yes
流程后exit 0
,它将认为该服务处于活动状态。
您还可以使用ExecStartPost=
运行 status 命令,如果 status 命令失败,这将导致服务失败。然而,这也意味着ExecStart
必须中的命令exit 0
。