Ağ çevrimiçi oluncaya kadar kullanıcı hizmetlerimi nasıl bekletebilirim?


15

Kullanıcıların etkinleştirmesini istediğim ve çalışan bir ağ bağlantısına ihtiyaç duyduğum birkaç sistemd kullanıcı hizmeti dosyası yazdım. Bunun kadar kolay olacağını düşündüm:

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

Ancak, hizmetler çok erken başlıyor gibi görünüyor ve journalctlgörüyorum:

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

Sonra daha fazla aradım ve denedim

Wants=network.target
After=network.target

ve yaptı sudo systemctl enable systemd-networkd-wait-online.service.

Şimdi var journalctl:

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

Ve tekrar hizmet çok erken başlar.

Bu mesaj orada mı olmalı? Sorunumda nasıl hata ayıklayabilirim?


EDIT : nedeni basit ve özellikle Arch Wiki'de belirtilmiştir :

systemd --userişlemden ayrı bir işlem olarak çalışır systemd --system. Kullanıcı birimleri sistem birimlerine referans veremez veya bunlara bağlı olamaz.

Bu forum sonrası basit bir çözüm önermek gibi görünüyor: Ben linkkullanıcı olarak gerekli sistem birimi gerekir , böylece birim arama yolu üzerinde kullanılabilir bir sembolik oluşturmak.

Bunu yaptıktan sonra herhangi bir No such file or directorymesaj görmüyorum , ancak ağ çevrimiçi olduktan sonra hizmetleri gerçekten çalıştıramıyorum. Ben bağlamayı denedi network.target, network-online.targetve systemd-networkd-wait-online.servicehiçbir başarı ile, her biri bağımlı benim birimleri ayarı. Bağlantılı birimin durumunu kullanıcı modunda kontrol ettiğimde, hepsi öldü, örneğin:

$ 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.

Ancak, network-online.targetbağladıktan sonra kullanıcı modunda etkin görebilirsiniz :

$ 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.

Umarım bir cevabın olur.

@Deleteme Teşekkürler, bunun nedenini bulduğumu düşünüyorum (güncellemeye bakın), ancak sorunun nasıl çözüleceğini değil.
Lev Levitsky

Hepiniz bu soruna bir çözüm buldunuz mu? Ayrıca, sadece bazı bağlantılı birimlerin öldüğünü vurguladığınızı fark ettim . Hangileri işe yaradı ve nasıl farklılar?
Sparhawk

@Sparhawk maalesef değil. Çözüm olarak, önyüklemeden sonra birkaç saniyeye ayarlanmış zamanlayıcıları kullanıyorum. Sorunun bir örneği var: ağ üzerinden çevrimiçi hedef bağlantı kurulduktan sonra etkin ve ağ hedefi etkin değil.
Lev Levitsky

Belki yanlış anlıyorum, ancak ağ her yeniden başlatıldığında, askıya alındıktan sonra e-postamı kontrol etmek için bir şeyler arıyorum . Bunu yapmanın bir yolu olacağını düşündüm. Şimdi örnekleri görüyorum. Bazı özel hizmetlerin işlendiğini ve bazılarının hizmet etmediğini düşündüm. Ancak, şimdi ağ hedeflerinin kullanıcı sürümlerinden bahsettiğinizi görüyorum.
Sparhawk

Yanıtlar:


3

Bir sistem hizmetine güvenemeyeceğiniz için, tek çözümünüz ağın çevrimiçi olup olmadığını algılayan bir kullanıcı hizmeti sunmaktır. (Ya da hizmetlerinizin sistem hizmetlerini yapın.) "Çevrimiçi algıla" kullanıcı hizmetinin ayrıntıları "çevrimiçi" tanımınıza bağlı olacaktır. Örneğin başarılı bir ping'in 8.8.8.8 olmasını bekleyebilir. Veya bir DNS ad çözümlemesinin başarılı olması için. Örneğin, vpnc ile benzer bir durumda, bir vpn IP'sine bir ping işleminin başarılı olmasını beklerim.

Ardından, kullanıcı hizmetlerinizi çevrimiçi algılama kullanıcı hizmetinize (After =) bağlı yapabilirsiniz.

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

Teşekkür ederim, bu yeterince makul ve basit görünüyor. Ancak 10 kullanıcı kullanıcı hizmetimi etkinleştirirse, aynı sunucuya aynı anda ping atmak için 10 örnek olacaktır, bu da biraz gereksiz görünüyor. Uygulamada bu muhtemelen sorun değil, ama bunu tüm kullanıcı hizmetleri için tek bir "çevrimiçi bayrak" elde etme umuduyla soruyordum. Yine de daha iyi bir çözüm önerilmemiştir.
Lev Levitsky

1

Böyle bir şeyi test etmenizi tavsiye ederim:

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

Bunu takiben:

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

5
Ancak bu bir sistem hizmetidir ve bir kullanıcı hizmeti kurmaya çalışıyorum.
Lev Levitsky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.