systemd Firewall.service 단위: 유형=exec 또는 유형=oneshot?

systemd Firewall.service 단위: 유형=exec 또는 유형=oneshot?

방화벽 서비스 장치를 디버깅하는 중인데 몇 가지 문제가 있습니다.

이러한 질문 중 하나는 exec이든 oneshot이든 해당 장치에 가장 적합한 서비스 유형입니다. 내 검색에서 두 가지에 대한 비교는 거의 나오지 않았습니다. 아마도 exec가 systemd(v.249 IIRC)에 상대적으로 새로 추가되었기 때문일 것입니다.

백그라운드로 이 유닛(iptables.service라고 함)은 네트워크가 시작되기 전에 Bash 스크립트(iptables.sh라고 함)를 실행하여 방화벽(iptables.sh라고 함)을 활성화하고 구성하도록 설계되었습니다., 네트워크 사전 타겟팅 전),예를 들어,

ExecStart=/bin/bash -c '/home/locsh/iptables.sh'

종류=일회용"활성" 상태로 전환되지 않으므로 나중에 다시 시작하거나 재활성화할 수 있다는 장점이 있습니다.예를 들어, 타이머 장치를 통해. 설명은 없지만 대부분의 예에서는 두 가지 유형 중 더 일반적입니다.

유형=실행장점은 기본 서비스 실행이 완료될 때까지 후속 장치의 시작이 지연된다는 것입니다. 네트워크는 성공적으로 실행되는 스크립트에 의존해야 하고 그렇지 않으면 다운된 상태를 유지해야 하기 때문에 이는 방화벽 서비스 장치에 완벽하게 적합한 것 같습니다.예를 들어, 어떤 이유로 관련 .mount 유닛이 아직 활성화되지 않았고 스크립트를 일시적으로 읽을 수 없는 경우.

다시 시작 = 실패 시두 경우 모두 이는 명백하고 신중한 추가로 보입니다.

첫 번째 질문어떤 이유로든 둘 중 하나가 더 나을 수도 있다는 것입니다.

두 번째 질문Type=exec는 부분적으로 장치의 순서 종속성으로 인해 "Restart=on-failure" 여부에 관계없이 일부 극단적인 경우에 미묘한 순서 주기를 도입할 수 있는 후속 장치의 시작을 지연합니까?

Before=network-pre.target

상대적으로 시작 프로세스 초기 단계입니다.

답변1

당신이 원하는 type=oneshot. 을 사용하면 type=exec방화벽을 구성하기 전에 다른 서비스를 시작할 수 있습니다. systemd.service매뉴얼 페이지 에서 다음 사항에 대해 설명합니다 exec.

...즉, 단순은 fork()가 반환된 직후에 추가 작업을 계속하는 반면, exec는 서비스 프로세스의 fork() 및 execve()가 모두 성공할 때까지 계속되지 않습니다.

을 위한 oneshot:

oneshot은 단순하게 작동하지만 서비스 관리자는 기본 프로세스가 종료된 후 장치를 고려합니다.

즉, Type=exec서비스 systemd가 "시작"된 상태에서여기 간다, 그리고 의 Type=oneshot경우 systemd프로세스가 성공하면 서비스가 "시작"된 것으로 간주됩니다.충분히.

관련 정보