web-dev-qa-db-ja.com

ネットワークがオンラインになるまでユーザーサービスを待機させるにはどうすればよいですか?

私は、ユーザーに有効にして欲しいネットワーク接続が必要なsystemdユーザーサービスファイルをいくつか作成しました。それは次のように簡単だと思いました:

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.

また、サービスの開始が早すぎます。

そのメッセージはそこにあるはずですか?どうすれば問題をデバッグできますか?


[〜#〜] edit [〜#〜]:理由は単純で、 Arch Wiki

systemd --userは、systemd --systemプロセスとは別のプロセスとして実行されます。ユーザー単位は、システム単位を参照または依存できません。

このフォーラムの投稿 は簡単な解決策を提案しているようです:ユーザーとして必要なシステムユニットをlinkする必要があるため、ユニット検索パスで利用できるシンボリックリンクを作成します。

その後、No such file or directoryメッセージは表示されませんが、ネットワークがオンラインになった後もサービスを実際に実行できません。 network.targetnetwork-online.targetsystemd-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.
15
Lev Levitsky

システムサービスに依存できないため、唯一の解決策は、ネットワークがオンラインかどうかを検出するユーザーサービスを提供することです。 (または、サービスをシステムサービスにします。)「オンライン検出」ユーザーサービスの詳細は、「オンライン」の定義によって異なります。たとえば、8.8.8.8へのpingが成功するのを待つことができます。または、DNS名前解決を成功させるために。たとえば、vpncを使用した同様の状況で、vpn IPへのpingが成功するのを待ちます。

次に、ユーザーサービスをオンラインの検出ユーザーサービスに(後=)依存させることができます。

#!/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
3
Stuart Gathman

私はこのようなものをテストすることをお勧めします:

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