启用的 systemd 服务不在启动时运行,但在手动运行时运行

启用的 systemd 服务不在启动时运行,但在手动运行时运行

在一台机器上,我准备了一个firewall.servicesystemd 服务,该服务在运行 Debian 9.5 的机器上运行良好。

现在我正在设置另一台机器,也运行 Debian 9.5,使用完全相同的脚本,但拒绝在启动时运行,我似乎找不到任何关于原因的指示。

启动后,下面是一些输出,仅向我表明 systemd 从未尝试首先启动该服务:

[root@bigbrother ~]# journalctl -u firewall
-- No entries --
[root@bigbrother ~]# systemctl status firewall
● firewall.service - Firewall setup via /etc/iptables.rules
   Loaded: loaded (/etc/systemd/system/firewall.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

防火墙服务位于/etc/systemd/system/firewall.service两台计算机上,如下所示:

[Unit]
Description=Firewall setup via /etc/iptables.rules
After=network.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables.rules

[Install]
WantedBy=network-online.target

正如您所看到的,它只是运行一个iptables-restore command,仅此而已。我以前曾用过这个/etc/rc.local,但我想人们必须跟上时尚并用于systemd此类事情(这很好,当它起作用时)。

该服务确实已启用:

[root@bigbrother ~]# systemctl disable firewall
Removed /etc/systemd/system/network-online.target.wants/firewall.service.
[root@bigbrother ~]# systemctl enable firewall
Created symlink /etc/systemd/system/network-online.target.wants/firewall.service → /etc/systemd/system/firewall.service.

手动运行时效果很好:

[root@bigbrother ~]# systemctl start firewall
[root@bigbrother ~]# systemctl status firewall
● firewall.service - Firewall setup via /etc/iptables.rules
   Loaded: loaded (/etc/systemd/system/firewall.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

Sep 09 17:10:52 bigbrother systemd[1]: Starting Firewall setup via /etc/iptables.rules...
Sep 09 17:10:53 bigbrother systemd[1]: Started Firewall setup via /etc/iptables.rules.

我缺少什么?

我在这里查看了一些类似的问题,但给我最大希望的问题实际上是一个拼写错误,所以我现在完全迷失了。我在不同的服务器上运行的是相同版本的 Debian,所以我很难相信这与服务的顺序有关。即便如此,我还是很乐意接受建议。

答案1

WantedBy=network-online.target默认情况下不是依赖链的一部分,您不应该这样使用它。

如果您确实需要在网络启动后启动该脚本,我建议您这样做:

[Unit]
Description=Firewall setup via /etc/iptables.rules
After=network.target
Before=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables.rules

[Install]
WantedBy=multi-user.target

https://www.freedesktop.org/software/systemd/man/systemd.special.html#network.target https://www.freedesktop.org/software/systemd/man/systemd.special.html#network-online.target

答案2

也许运行得太早了。这文档解释network.target如何主要目的是在关闭时正确订购物品

相反network-pre.target主要目的是与防火墙服务一起使用。想要在网络配置之前运行的服务应该使用

Before=network-pre.target 
Wants=network-pre.target

firewalld.service例如,这就是我在 Fedora 24 的 Unit 中看到的,我认为它是iptables.

相关内容