네트워킹이 시작된 후 스크립트가 실행됩니까?


102

나는 체계적으로 익숙하지 않으며 아키텍처를 배우고 있습니다.

지금은 사용자 정의 쉘 스크립트를 실행시키는 방법을 알아 내려고 노력 중입니다. 이 스크립트 는 네트워킹 계층이 시작된 후에 실행해야 합니다.

netctl뿐만 아니라 systemd를 사용하여 Arch를 실행하고 있습니다.

테스트하기 위해 간단히 실행하는 간단한 스크립트를 작성했습니다 ip addr list > /tmp/ip.txt. 이 스크립트에 대해 다음 서비스 파일을 작성했습니다.

(/etc/systemd/system/test.service)
[Unit]
Description=test service

[Service]
ExecStart=/root/test.script

[Install]
WantedBy=multi-user.target

그런 다음 스크립트를 사용하여

systemctl enable test

다시 시작하면 스크립트는 실제로 실행되지만 네트워크가 시작되기 전에 실행됩니다. 다시 말해, 출력 ip.txt은 기본 인터페이스에 할당 된 IPv4 주소 를 표시하지 않습니다. 로그인 할 때 실제로 IPv4 주소가 할당되었고 네트워킹이 시작되었습니다.

WantedBy매개 변수 를 엉망으로 스크립트가 실행되는 지점을 변경할 수 있다고 생각 하지만 그 방법을 잘 모르겠습니다.

누군가 올바른 방향으로 나를 가리킬 수 있습니까?

답변:


126

시스템화 된 네트워크 구성 종속성

systemd의 단위 순서에 영향을주는 것은 매우 쉽습니다. 반면에 완성 된 장치가 보장하는 것에주의해야합니다.

서비스 구성

현재 시스템에서 주문한 후에 network.target는 실제 구성이 아니라 네트워크 서비스가 시작되었음을 보증합니다. network-online.target그것을 달성 하기 위해서는 주문 후 가져와야합니다.

[Unit]
Wants=network-online.target
After=network-online.target

구형 시스템과의 호환성을 위해 network.target 다음에 주문해야 할 수도 있습니다.

[Unit]
Wants=network-online.target
After=network.target network-online.target

그것은 서비스의 단위 파일과 시스템을위한 것입니다.

현재 버전의 소프트웨어에서 구현

이제 network-online.target예상대로 작동 하는지 또는 최소한 사용할 수 있는지 확인해야 합니다 network.target.

현재 버전의 네트워크 매니저는 쿠폰 NetworkManager-wait-online.service에 의해 당겨 도착하는이 network-online.target서비스에 의해 때문에. 이 특수 서비스는 서비스가 시작되도록 구성된 모든 연결이 자동으로 성공, 실패 또는 시간 초과 될 때까지 기다립니다.

systemd-networkd 의 현재 버전은 모든 장치가 요청 된대로 구성 될 때까지 서비스를 차단합니다. 부팅시 적용되는 설정 만 지원한다는 점이 더 쉽다 (특히 systemd-networkd.service의 시작 시간).

완전성을 위해 /etc/init.d/networkFedora 의 서비스는 현재 버전의 시스템화, 차단 network.target및 간접적으로 차단 network-online.target하고 서비스 를 해석 합니다. 스크립트 기반 구현의 예입니다.

데몬 기반이든 스크립트 기반이든 구현이 위의 네트워크 관리 서비스 중 하나로 작동하는 경우 네트워크 구성이 성공적으로 완료되거나 정당한 이유로 실패하거나 합당한 시간이 초과 될 때까지 서비스 시작이 지연됩니다 완료 할 프레임.

netctl 이 동일한 방식으로 작동 하는지 여부를 확인 하고 해당 정보가이 답변에 귀중한 추가 사항이 될 수 있습니다.

이전 버전의 소프트웨어에서 구현

나는 이것이 잘 작동하지 않는 충분히 오래된 버전의 시스템을 볼 것이라고 생각하지 않습니다. 그러나 최소한 network-online.target존재하고 이후에 주문되는지 확인할 수 있습니다 network.target.

이전에는 NetworkManager 가 최소한 하나의 연결 만 적용되도록 보장했습니다. 그리고 그것이 작동하기 위해서는 NetworkManager-wait-online.service명시 적으로 활성화해야합니다 . 이것은 Fedora에서 오랫동안 수정되었지만 최근에 업스트림에만 적용되었습니다.

systemctl enable NetworkManager-wait-online.service

network.target 및 network-online.target 구현에 대한 참고 사항

혹시에 따라 소프트웨어를 만들 필요가 없습니다 NetworkManager.service또는 NetworkManager-wait-online.service다른 특정 서비스를 아니다. 대신, 모든 네트워크 관리 서비스는 이전 network.target과 선택적으로 스스로 주문해야합니다 network-online.target.

간단한 스크립트 기반 네트워크 관리 서비스는 종료하기 전에 네트워크 구성을 완료해야하며 이전 network.target과 간접적으로 전에 자체적으로 주문해야합니다 network-online.target.

[Unit]
Before=network.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

데몬 기반 네트워크 관리 서비스는 network.target그다지 유용하지 않더라도 먼저 주문해야 합니다.

[Unit]
Before=network.target

[Service]
Type=simple
ExecStart=...

데몬이 완료되기를 기다리는 서비스는 특정 서비스 이후와 그 이전에 주문해야합니다 network-online.target. 그것은 사용한다 Requisite각각의 네트워크 관리 서비스가 사용되지 않는 경우 즉시 실패 있도록 데몬 서비스에.

[Unit]
Requisite=...
After=...
Before=network-online.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

패키지는 wants디렉토리에 대기 서비스에 대한 심볼릭 링크를 설치하여 network-online.target구성된 네트워크를 대기하려는 서비스에 의해 가져와야합니다.

ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/

관련 문서

최종 노트

나는 당신이 질문했을 때 당신의 질문에 대답하는 데 도움이되었을뿐만 아니라, 업스트림 및 Linux 배포판의 상황을 개선하는 데 기여하여 원래의 글을 쓸 때보 다 더 나은 답변을 줄 수 있기를 바랍니다. .


"모든 연결이 자동으로 시작되도록 구성 될 때까지 기다리십시오"라는 자동 연결 옵션을 의미합니까? no-auto-default = *를 설정할 때이 기능을 사용할 수 있지만 연결 중 하나에 autoconnect = yes가 있습니까? 그리고 마지막 질문-nm-online 및 매뉴얼 페이지의 --start-for-startup 옵션을 이해하지 못합니다. 이 글을 보내 주셔서 감사합니다.
lzap

내가 아는 한 nm-online은 no-auto-default, 신경 쓰지 않습니다 auto. 구체적인 질문이 있습니까? 내 생각에 nm-online 맨 페이지 -s는 모든 자동 연결이 시도, 즉 연결되거나 실패 할 때까지 기다린다는 것을 분명히 나타냅니다 .
Pavel Šimerda

한 시간 동안이 쓰레기를 엉망으로 만든 후에 해결책을 찾았습니다 : apt-get install sysv-init. :-) 몇 가지 쉘 스크립트를 대체 할 수있는 시스템 복잡성으로 인해 어려움이 따릅니다.
누군가

@ 누군가이 경우 initscripts가 답이 아닌 것이 두렵습니다. NetworkManager 또는 다른 동적 구성 도구를 사용하는 경우, 완전히 구성된 네트워크 후에 initscript를 주문할 수 없습니다. /etc/init.d/network또는 유사한 것을 사용하여 제한된 동적 구성을 얻을 수 있지만 보편적으로 작동하지는 않습니다.
Pavel Šimerda

@Pavel Šimerda Init는 순차적으로 실행되며, 후속 스크립트가 필요로하는 작업을 마칠 때까지 적절한 init 스크립트가 반환되지 않습니다. 네트워킹에 적용 가능한 모든 어댑터가 준비되어 있어야합니다. 운이 좋은 타이밍이 아니라면, NM은 그 맥락에서 잘 작동합니다. 실제 문제는 NM이 기존의 단순하고 검증되고 테스트 된 구조를 구축하는 대신 네트워크 처리를 재창조하는 것입니다. 데스크톱 사용자는 복잡성의 위험에 대한 개념이없는 것 같습니다. ;-)
누군가

9

당신은 사용할 수 있습니다 After에서 [Unit]서비스가 시작되기 전에 시작되어야하는 서비스를 정의하는 섹션. 예를 들어 NetworkManager를 사용하는 경우 NetworkManager가 시작된 후 서비스를 시작할 수 있습니다.

[Unit]
Description=test service
After=NetworkManager.service

BindsTo서비스가 일회성 이벤트이고 영구 서비스가 아니기 때문에 여기서는 적절하지 않습니다 ( ExecStop네트워킹이 다운 될 때 실행 되는 기능 도 포함하지 않는 한 ).
goldilocks

제거BindsTo
phoops

BindsTo그러나 NetworkManager가 Requires수행하는 경우 에만 서비스를 실행하려는 경우 를 대체 할 항목을 추가 할 수 있습니다 . After실제로 그렇게하지 않습니다 - 그냥 의미 경우 NM도 실행 한 후, 그 후에이 작업을 실행합니다. NM이 실행되지 않으면 서비스는 임의의 지점에서 실행됩니다.
goldilocks

4
After = network.target이보다 일반적이므로 After = NetworkManager.service보다 낫습니다.
Pavel Šimerda

7
그 지정이 주목 After=foo됩니다 하지 원인 foo장치가 아직 시작되지 않은 경우, 그것은 것입니다 시작 단위를 주문하는 방법을 systemd에게 그들이 모두 같은 시간에 시작하는 경우 . 사용 양 After=foo뿐만 아니라 Wants=fooRequires=foo에 당기는 효과가있을 것이다 foo단위 올바르게 systemd 순서를 만드는 또한 시작되어 있지 않은 경우 등을.
Emil Lundberg '

8

서비스가 누군가가 서버에 연결하기를 수동적으로 기다릴 수있는 서버를 제공한다면 다음을 사용하십시오.

[Unit]
After=network.target

서비스는 와일드 카드 인터페이스에서 바인딩해야합니다. 소켓 활성화 (권장)를 사용하거나 로컬 전용 인 경우 네트워크 대상을 완전히 무시할 수 있습니다.

서비스가 클라이언트 역할을하거나 피어 투 피어 인 경우 더 적합합니다.

[Unit]
After=network-online.target
Requires=network-online.target

systemd 213 이전에 network-online.target은 Pavel이 언급 한 해결 방법이 필요합니다 (네트워크가 작동하기를 기다리는 서비스를 수동으로 활성화해야합니다). 시스템 213부터는 기본적으로이 작업이 수행됩니다. systemd-networkd-wait-online루프백이 아닌 인터페이스에서 하나 이상의 주소 (라우팅 가능 또는 로컬 링크)가 구성 될 때까지 기다립니다.

systemd-networkd, NetworkManager 또는 이와 동등한 구성은 독립적 인 작업입니다. DHCP (IPv4의 경우) 및 NDP (IPv6의 경우)는 기본적으로 작동하지만 "네트워크가 작동 중"이라는 정확한 정의가 트리거되도록 구성해야합니다 network-online.target.

문서:


기존의 (정말로) 잘 구성된 답변에 대한 작은 개선뿐만 아니라 새로운 답변이 왜 궁금한지 궁금합니다.
Pavel Šimerda

처음 두 문서 링크는 현재 기능이 없습니다.
피터 한센

왜 Want 대신에 Need를 사용해야합니까?
Karl Morrison

4

WantedBy 매개 변수로 엉망으로 스크립트가 실행되는 지점을 변경할 수 있다고 생각합니다.

그것은 당신이 원하는 것과 반대의 영향을 미칩니다. 보낸 사람 man systemd.unit:

WantedBy =, RequiredBy =

[...] systemctl enable로이 장치를 설치할 때 나열된 각 장치의 .wants / 또는 .requires / 디렉토리에 기호 링크가 작성됩니다. 이는 Wants = 또는 Require = 유형의 종속성이 나열된 단위 에서 현재 단위 추가 되는 효과가 있습니다 .

이를 바탕으로 적절한 단위 옵션이 "Wants"또는 "Requires"임을 알 수 있습니다. 이러한 설명에 따라 "필수"는 아마도 "후"를 추가하여 네트워킹 서비스가 실행될뿐만 아니라이 장치보다 먼저 실행되도록하는 것이 정확할 것입니다.

단위 옵션 없음, AFAIK, 시작된 임시 수입이 완료, 또는 그것은 단지 것을, (네트워킹 아마 데몬 서비스)의 특정 지점에 도달해야한다는 규정을 포함 할 수 있습니다 시작 첫번째. 이를 염두에두고 스크립트를 작성하여 Type=forking정상적인 지연 (예 : 30 초) 또는 지연을 포함하여 일종의 종료시 루프를 발생시켜 DHCP 임대가 먼저 있는지 확인하십시오.


1
WantedBy와 RequiredBy는 모두 주문에 영향을 미치지 않습니다.
Pavel Šimerda

1
@ PavelŠimerda : 아무도 그들이 주장했다. 주문은 "네트워킹 서비스가 실행될뿐만 아니라이 장치보다 먼저 실행되도록하기 위해" After와 함께 명시 적으로 언급 한 이유 Requires입니다.
goldilocks

1
예, After함께 작동 Wants하거나 Requires그런 식으로. 반면, 명시 적 지연은 종속성 기반 도구에서 나쁜 습관입니다. 특히 네트워크가 시스템 설명서에 의해 구성 될 때까지 명시 적으로 기다리는 방법이있을 때는 다운 보트를 고집해야합니다.
Pavel Šimerda

3

서비스를 시작하기 전에 시작해야 할 사항을 지정 After하려면 [Unit]섹션 에서 사용하십시오 . (이전 답변의 많은 부분이 맞습니다.)

네트워크가 가동 된 후 서비스를 시작하려면 네트워크 대상을 사용하십시오. 네트워크 대상은 NetworkManager, Arch의 conf.d / netctl 시스템 또는 systemd가 알고있는 다른 서비스 중 어느 것을 사용할지 적용해야합니다.

[Unit]
#.....
After=network.target

간단히 살펴보면 네트워크 연결을 사용하는 시스템의 다른 모든 서비스에이 지시문이 포함되어 있음을 확인할 수 있습니다.

또한 systemd를 사용하는 모든 배포판에 이식 가능합니다. 장치 파일은 Arch, Fedora, RHEL 7, 이후 버전의 데비안에서 동일합니다 ...


Arch의 스크립트 또는 자신의 스크립트와 같은 네트워크 연결 을 시작 하는 서비스 는 고유 한 단위 파일로 지정해야 합니다.

[Unit]
Wants=network.target
Before=network.target

나는 Wants다른 패키지에 부작용이 있기 때문에 부분을 완전히 좋아하지 않습니다 . 내 대답 좀 봐
Pavel Šimerda

여기서는 Wantson network.target이 좋은 생각 임을 깨달았습니다 .
Pavel Šimerda

network-online.target을 정말로 사용하고 싶습니다. 심판
에드워드 Torvalds

1

이 기사에 요점을 추가하고 싶었습니다. IPv6 네트워킹이 시작되기 전에 RHEL7 / CentOS 7에서 현재 (2015 년 여름) network-online.target이 잘못 설정되어 있습니다.

Wants=network-online.target
After=network-online.target

서비스 정의에서 IPv6 주소에 명시 적으로 바인드 된 IPv6이 시작되어 실행되기 전에 시작되어 실패 할 수 있습니다.


어쨌든 결함이있는 커널 기반 IPv6 자동 구성의 경우에만 해당됩니다. IPv6 이후에 제대로 주문하려면을 대신 NetworkManager를 사용해야 /etc/init.d/network합니다. NM에서도 동일한 문제가 발생하면 기능 요청을 제출하는 것이 좋습니다. RHEL / CentOS에서 확인하지 않았습니다. 관심이 있으시면 자세한 내용을 알려 드릴 수 있습니다.
Pavel Šimerda

0
[Unit]
After=systemd-networkd.service

나를 위해 작동합니다.


특별한 경우에는 작동하는지 확실하지 않지만 몇 가지 이유로 잘못되었습니다. 그중 하나는 networkd자체 / wait-online / 서비스 를 제공 한다는 것입니다 . network-online.target이를 지원하는 모든 서비스를 이용하려면 올바른 방법으로 주문을 받고 주문 을 처리하십시오.
Pavel Šimerda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.