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


14

私はユーザーに有効にして欲しい、そして機能するネットワーク接続を必要とするいくつかの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.

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

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


編集:理由は単純で、Arch Wikiで具体的に述べられています:

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

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

その後、No such file or directoryメッセージは表示されませんが、ネットワークがオンラインになった後でもサービスを実際に実行することはできません。network.targetnetwork-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ありがとう、私はこれの原因を見つけたと思います(更新を参照)が、問題の解決方法ではありません。
レフレヴィツキー

この問題の解決策を見つけましたか?また、いくつかのリンクされたユニットのみが死んでいることを強調していることに気付きました。どちらが機能し、どのように違いますか?
スパルホーク

残念ながら@Sparhawkはそうではありません。回避策として、起動後数秒に設定されたタイマーを使用します。質問には例があります:リンク後にネットワークオンラインターゲットがアクティブになり、ネットワークターゲットがアクティブになりません。
レフレヴィツキー

おそらく誤解されているかもしれませんが、ネットワークが再開するたびに起動するものを探して、サスペンドから再開した後にメールをチェックしています。これがその方法だと思いました。今すぐ例を見る。いくつかのカスタムサービスが起動され、一部は起動されなかったことを意味すると思いました。ただし、ネットワークターゲットのユーザーバージョンについてお話ししているようです。
スパルホーク

回答:


3

システムサービスに依存することはできないため、唯一の解決策は、ネットワークがオンラインかどうかを検出するユーザーサービスを提供することです。(または、サービスをシステムサービスにします。)「オンライン検出」ユーザーサービスの詳細は、「オンライン」の定義に依存します。たとえば、8.8.8.8へのpingが成功するのを待つことができます。または、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を実行することになり、少し冗長になります。実際には、これはおそらく問題ではありませんが、すべてのユーザーサービスで利用可能な単一の「オンラインフラグ」を取得することを期待してこれを求めていました。しかし、より良い解決策はまだ提案されていません。
レフレヴィツキー

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
しかし、これはシステムサービスであり、ユーザーサービスを設定しようとしています。
レフレヴィツキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.