네트워크가 온라인 상태가 될 때까지 사용자 서비스를 대기 시키려면 어떻게해야합니까?


14

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

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.

나는 당신이 대답을 바랍니다.

@Deleteme 감사합니다.이 문제의 원인을 발견했다고 생각하지만 (업데이트 참조) 문제를 해결하는 방법은 아닙니다.
Lev Levitsky

이 문제에 대한 해결책을 모두 찾으셨습니까? 또한, 당신 은 일부 연결된 유닛 만이 죽었다 는 것을 강조합니다 . 어느 것이 효과가 있었으며 어떻게 다릅니 까?
Sparhawk

@Sparhawk는 불행히도 아닙니다. 해결 방법으로 부팅 후 몇 초로 설정된 타이머를 사용합니다. 이 질문에는 예가 있습니다. 링크 후 네트워크 온라인 대상이 활성화되어 있고 네트워크 대상이 없습니다.
레프 레 비츠 키

어쩌면 나는 오해하지만 , 네트워크가 재개 될 때마다 해고 할 일을 찾고 있는데 , 일시 중지에서 재개 한 후 내 이메일을 확인합니다. 나는 이것이 그렇게 할 것이라고 생각했다. 나는 지금 예제를 본다. 나는 당신이 어떤 커스텀 서비스가 시작되었다고 생각했고 그렇지 않은 것을 생각했습니다. 그러나 이제는 네트워크 대상의 사용자 버전에 대해 이야기하고 있습니다.
Sparhawk

답변:


3

시스템 서비스에 의존 할 수 없으므로 유일한 해결책은 네트워크가 온라인인지 여부를 감지하는 사용자 서비스를 제공하는 것입니다. (또는 서비스 시스템 서비스를 작성하십시오.) "온라인 검색"사용자 서비스의 세부 사항은 "온라인"의 정의에 따라 다릅니다. 예를 들어 핑이 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

감사합니다. 이것은 합리적이고 간단 해 보입니다. 그러나 10 명의 사용자가 내 사용자 서비스를 사용하도록 설정하면 10 개의 인스턴스가 동일한 서버를 동시에 핑 (Ping) 할 수 있습니다. 실제로 이것은 문제가되지는 않지만 모든 사용자 서비스에서 사용할 수있는 단일 "온라인 플래그"를 얻기 위해이 문제를 묻고있었습니다. 그러나 더 나은 해결책은 아직 제안되지 않았습니다.
Lev Levitsky

1

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

# /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

4
그러나 이것은 시스템 서비스이며 사용자 서비스를 설정하려고합니다.
Lev Levitsky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.