방화벽 서비스 장치를 디버깅하는 중인데 몇 가지 문제가 있습니다.
이러한 질문 중 하나는 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
프로세스가 성공하면 서비스가 "시작"된 것으로 간주됩니다.충분히.