네트워크 연결 후 systemd 서비스 시작

네트워크 연결 후 systemd 서비스 시작

제가 systemd를 만져본 것은 이번이 처음입니다. 네트워크가 가동된 후 서비스가 시작되도록 관리하는 방법에 대한 해결책을 찾을 수 없습니다. knockd.serviceRaspbian 시스템에서 부팅하려고 합니다 .

시작한 후 서비스가 실행 중인지 확인합니다.

systemctl status knockd
   Loaded: loaded (/lib/systemd/system/knockd.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Thu 2019-06-27 14:36:26 CEST; 7min ago
     Docs: man:knockd(1)
  Process: 516 ExecStart=/usr/sbin/knockd $KNOCKD_OPTS (code=exited, status=1/FAILURE)
 Main PID: 516 (code=exited, status=1/FAILURE)

Jun 27 14:36:26 pins2 systemd[1]: Started Port-Knock Daemon.
Jun 27 14:36:26 pins2 knockd[516]: could not get IP address for eth0
Jun 27 14:36:26 pins2 systemd[1]: knockd.service: Main process exited, code=exited, status=1/FAILURE
Jun 27 14:36:26 pins2 systemd[1]: knockd.service: Unit entered failed state.
Jun 27 14:36:26 pins2 systemd[1]: knockd.service: Failed with result 'exit-code'.

내 생각에 문제는 이렇다.

could not get IP address for eth0

제가 많이 조사한 결과(예를 들어여기그리고거기) 좋은 팁을 찾았지만 안타깝게도 여전히 작동하지 않습니다. 내 .service파일은 다음과 같습니다.

systemctl cat knockd
# /lib/systemd/system/knockd.service
[Unit]
Description=Port-Knock Daemon
Documentation=man:knockd(1)                                                                         
#Requires=network-online.target                                                                     
#Wants=network-online.target                                                                     
After=network-online.target                                                                    

[Service]                                                                                           
EnvironmentFile=-/etc/default/knockd                                                                
ExecStart=/usr/sbin/knockd $KNOCKD_OPTS                                                             
ExecReload=/bin/kill -HUP $MAINPID                                                                  
KillMode=mixed                                                                                      
SuccessExitStatus=0 2 15                                                                            
ProtectSystem=full                                                                                  
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN                                                     

[Install]                                                                                           
WantedBy=multi-user.target                                                                          
Alias=knockd.service                

나는 사용했다After=network-online.target단위부분. 그렇게 해봤는데 Requires=또 어떻게 해야 하나요 Wants=?

부팅한 후 시스템에 IP 주소가 있고 수동으로 서비스를 시작하면 제대로 작동합니다. 더 빠른 네트워크를 갖춘 다른 네트워크에서는 대상이 없어도 문제가 없었습니다 network-online.

상상할 수 있듯이 노크가 안정적으로 시작되는 것이 매우 중요합니다. 그렇지 않으면 잠길 수 있기 때문입니다.

이것이 안정적으로 작동한다면 부팅 후 얼마 후에 네트워크 케이블이 연결되어 있어도 작동합니까?

그런데, 파일을 편집해서는 안 된다는 것을 알고 있습니다 .service. /lib/systemd/...단지 가능한 덮어쓰기 문제를 해결하기 위해 편집하는 것뿐입니다. 모든 것이 잘 작동하면 이 문제를 해결하겠습니다. 당신의 도움을 주셔서 감사합니다.

답변1

Wants=이 지시어는 기본적으로 종속성 체인에 포함되지 않기 때문에 필요합니다 network-online.target(systemd.special(7) 맨페이지 참조).

ifupdown-wait-online.serviceNetworkManager를 사용하지 않는 경우 활성화해야 할 수도 있습니다(systemctl 활성화 ifupdown-wait-online.service).

답변2

@Bigon은 전반적으로 올바른 아이디어를 가지고 있습니다.

여기서 핵심 문제는 network-online.target일반적으로 systemd의 종속성 트리에 포함되지 않는다는 것입니다. systemd는 After=network-online.target유닛의 행을 처리할 때 network-online.target이런 일이 발생하지 않기 때문에 이를 무시할 수 있다고 결정합니다.

필요한 것은 network::drum Roll::online일 때 network-online.target을 종속성 트리로 끌어들이는 장치입니다. 많은 배포판에서 이러한 단위를 제공합니다. 네트워크 관리자도 종종 이 기능을 제공합니다.

귀하의 배포판을 모르기 때문에 어떤 단위를 활성화해야 하는지 알기가 어렵습니다. 그리고 네트워크 관리자로 전환하면~ 할 것이다Network Manager는 또한 기존 구성과 충돌할 수 있는 시스템 작동 방식에 대한 많은 변경 사항을 적용합니다.

답변3

네트워크 관리자를 설치하면 Rasbian에서 제대로 작동합니다.

NetworkManager는 NetworkManager-wait-online.service를 허용합니다. kockd가 시작될 때 인터페이스가 준비되지 않았기 때문에 네트워크는 인터페이스를 가동할 시간이 있습니다.

관련 정보