네트워크가 온라인 상태가 될 때까지 사용자 서비스를 대기 시키려면 어떻게해야합니까? 일찍 시작됩니다. 그 메시지가 거기에

사용자가 활성화하고 작동하는 네트워크 연결이 필요한 시스템화 된 사용자 서비스 파일 몇 개를 작성했습니다. 나는 그것이 다음과 같이 쉬운 것이라고 생각했다.

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

그러나 서비스가 너무 일찍 시작되는 것 같습니다 journalctl.

network-online.target: Cannot add dependency job, ignoring: Unit network-online.target failed to load: No such file or directory.

그런 다음 더 많이 검색하고 시도했습니다.

Wants=network.target
After=network.target

그리고했다 sudo systemctl enable systemd-networkd-wait-online.service.

이제 나는 journalctl:

network.target: Cannot add dependency job, ignoring: Unit network.target failed to load: No such file or directory.

그리고 다시 서비스가 너무 일찍 시작됩니다.

그 메시지가 거기에 있어야합니까? 문제를 어떻게 디버깅 할 수 있습니까?


편집 : 이유는 간단하고 아치 위키에 명시되어 있습니다 .

systemd --user프로세스와 별도의 프로세스로 실행됩니다 systemd --system. 사용자 단위는 시스템 단위를 참조하거나 의존 할 수 없습니다.

이 포럼 게시물 은 간단한 해결책을 제안하는 것 같습니다 link. 필요한 시스템 단위를 사용자로 사용해야 하므로 단위 검색 경로에서 사용 가능한 심볼릭 링크가 만들어집니다.

그렇게 한 후에도 No such file or directory메시지가 표시되지 않지만 네트워크가 온라인 상태가 된 후에도 서비스를 실제로 실행할 수는 없습니다. 나는 network.target, network-online.target및을 연결하려고 시도했지만 systemd-networkd-wait-online.service성공하지 않고 각 장치에 의존하도록 장치를 설정했습니다. 사용자 모드에서 연결된 장치의 상태를 확인하면 모두 죽었습니다. 예 :

$ systemctl --user status network.target
● network.target - Network
   Loaded: loaded (/usr/lib/systemd/system/network.target; linked; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
$ systemctl status network.target
● network.target - Network
   Loaded: loaded (/usr/lib/systemd/system/network.target; static; vendor preset: disabled)
   Active: active since Sat 2015-07-18 19:20:11 MSK; 3h 35min ago
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget

Jul 18 19:20:11 calc-server systemd[1]: Reached target Network.
Jul 18 19:20:11 calc-server systemd[1]: Starting Network.

그러나 network-online.target연결 후 사용자 모드에서 활성 상태를 볼 수 있습니다 .

$ systemctl --user status network-online.target
● network-online.target - Network is Online
   Loaded: loaded (/usr/lib/systemd/system/network-online.target; linked; vendor preset: enabled)
   Active: active since Sun 2015-07-19 00:35:38 MSK; 2min 48s ago
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget

Jul 19 00:35:38 calc-server systemd[469]: Reached target Network is Online.
Jul 19 00:35:38 calc-server systemd[469]: Starting Network is Online.



답변

시스템 서비스에 의존 할 수 없으므로 유일한 해결책은 네트워크가 온라인인지 여부를 감지하는 사용자 서비스를 제공하는 것입니다. (또는 서비스 시스템 서비스를 작성하십시오.) “온라인 검색”사용자 서비스의 세부 사항은 “온라인”의 정의에 따라 다릅니다. 예를 들어 핑이 8.8.8.8에 도달 할 때까지 기다릴 수 있습니다. 또는 DNS 이름 확인이 성공합니다. 예를 들어, vpnc와 비슷한 상황에서 VPN IP에 대한 Ping이 성공하기를 기다립니다.

그런 다음 사용자 서비스가 온라인 검색 사용자 서비스에 의존하도록 (After =) 만들 수 있습니다.

#!/bin/sh

host="${1:-8.8.8.8}"

pingcheck() {
  ping -n -c 1 -w 5 $1 >/dev/null 2>&1
}

# Do you want a timeout ?
while :; do
  pingcheck ${host} && exit 0
  sleep 10
done


답변

다음과 같이 테스트하는 것이 좋습니다.

# /etc/systemd/system/foo.service
[Unit]
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/logger -t foo "testing online target"

[Install]
WantedBy=multi-user.target

뒤에 :

# systemctl daemon-reload && systemctl enable foo.service


답변