활성화된 시스템 서비스는 시작 시 실행되지 않지만 수동으로 실행될 때는 실행됩니다.

활성화된 시스템 서비스는 시작 시 실행되지 않지만 수동으로 실행될 때는 실행됩니다.

firewall.service한 컴퓨터에서는 Debian 9.5를 실행하는 컴퓨터에서 제대로 실행되는 systemd 서비스를 준비했습니다 .

이제 똑같은 스크립트로 데비안 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.

내가 무엇을 놓치고 있나요?

여기서 비슷한 질문 몇 개 찾아봤는데, 나에게 가장 큰 희망을 주었던 질문은 사실 오타였기 때문에 지금은 완전히 헤매고 있습니다. 나는 다른 서버에서 동일한 버전의 데비안을 실행하고 있기 때문에 이것이 서비스 순서와 관련이 있다고 믿기 어렵습니다. 그럼에도 불구하고 나는 제안에 열려 있습니다.

답변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.

관련 정보