有効なシステムサービスは起動時には実行されませんが、手動で実行すると実行されます。

有効なシステムサービスは起動時には実行されませんが、手動で実行すると実行されます。

firewall.serviceあるコンピュータでは、Debian 9.5を実行しているコンピュータで正しく実行されるsystemdサービスを準備しました。

これで、同じスクリプトで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

ご覧のとおり、1つだけ実行すると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のユニットで見ることができますiptables

関連情報