私は、ユーザーに有効にして欲しいネットワーク接続が必要な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.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への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
私はこのようなものをテストすることをお勧めします:
# /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