특정 서비스가 특정 인터페이스에 의존하도록 만드는 방법은 무엇입니까? [복사]

특정 서비스가 특정 인터페이스에 의존하도록 만드는 방법은 무엇입니까? [복사]

SystemD를 사용하여 특정 서비스가 특정 네트워크 인터페이스의 시작에 종속되도록 하려면 어떻게 해야 합니까?

libvirtd예를 들어, 802.1ad 결합 인터페이스가 있고 다른 인터페이스를 통해 네트워크에 액세스할 수 있더라도 부팅하기 전에 SAN/NAS에 액세스할 때까지 기다려야 한다고 가정해 보겠습니다 . 아니면 sshfsVPN 연결을 기반으로 자동 시작(및 자동 해제)하려는 마운트가 있다고 가정해 보겠습니다 .

네트워크 인터페이스에 대한 세분화된 종속성을 처리하는 관용적 방법은 무엇입니까?

현재 저는 Ubuntu 및 CentOS7에서 NetworkManager를 사용하고 있지만 다른 플랫폼에 적합한 네트워크 상태 관리 메커니즘도 사용할 수 있습니다.

답변1

실제로 확립된 표준이 없다고 생각하지만 systemd.

실행 시작 전=

ExecStart=의 명령 이전에 각각 실행되는 추가 명령입니다. 구문은 여러 명령줄이 허용되고 명령이 순차적으로 실행된다는 점을 제외하면 ExecStart=와 동일합니다.

"-" 접두사 없이 이러한 명령 중 하나라도 실패하면 나머지 명령은 실행되지 않으며 장치는 실패한 것으로 간주됩니다.

다시 시작 = 실패 시

서비스 프로세스가 종료되거나 종료되거나 시간 초과될 때 서비스를 다시 시작할지 여부를 구성합니다.

on-failure로 설정하면 프로세스가 0이 아닌 종료 코드로 종료될 때 신호(코어 덤프를 포함하지만 위의 4개 신호는 포함하지 않음)에 의해 종료되고 작업(예: 서비스 다시 로드) 시간이 초과될 때 , 구성된 보기가 트리거되면 워치독 시간이 초과됩니다.


명령이 0이 아닌 종료 코드를 반환하는 경우 실패한 것으로 간주되므로 인터페이스가 작동 중임을 증명하도록 설정하면 ExecStartPre서비스에서 이를 요구하도록 할 수 있습니다.

몇 가지 예:

ExecStartPre=/usr/bin/ping -c 1 ${SAN_IP}

ExecStartPre=/usr/sbin/iscsiadm -m session

개인적으로 iscsiadm사용 사례의 변형이 마음에 듭니다. iscsi 연결이 존재하면 반환 값은 0이고, 그렇지 않으면 21이 반환됩니다(이로 인해 서비스가 실패하게 됩니다). 이 ping변형은 더 넓은 범위의 목적으로 사용될 수 있지만 대부분의 경우 네트워크 상태를 확인하려면 더 적절한 명령을 찾아야 할 것입니다. ssh다른 호스트의 콘텐츠를 검사하도록 설정된 키가 있는 경우에도 이 방법을 시도해 볼 수 있습니다.

요점은 ExecStartPre어떤 명령에서도 서비스가 실패할 수 있다는 것입니다. 사용하는 명령이 필요할 때 0이 아닌 종료 코드를 반환하는지 확인하세요. (예: cat빈 파일을 입력하면 0을 반환하고, cat존재하지 않는 파일을 입력하면 1을 반환합니다.)


약간의 생각과 질문자의 의견 후에 나는 말할 것입니다.최고서비스에 대한 복잡한 조건을 정의하는 방법은 해당 서비스가 의존하는 다른 서비스를 만드는 것입니다.

새 서비스를 생성하고 이 명령을 사용하여 상태를 확인합니다 ExecStart. 그것을 제공 Restart=on-failure. 그런 다음 원래 서비스를 만드 Require십시오 After.

위에서 사용한 예는 ExecStartPre서비스가 제대로 작동하도록 설정하려는 원래 목적에서 약간 왜곡되었습니다. 여전히 적용 가능하고 지식이 여전히 유용하므로 그대로 유지하고 있습니다.

관련 정보