नेटवर्क ऑनलाइन होने तक मैं अपनी उपयोगकर्ता सेवाओं का इंतजार कैसे कर सकता हूं?


15

मैंने सिस्टमड उपयोगकर्ता सेवा फ़ाइलों के एक जोड़े को लिखा है जो मैं चाहता हूं कि उपयोगकर्ता सक्षम हों और जिन्हें कार्यशील नेटवर्क कनेक्शन की आवश्यकता हो। मैंने सोचा था कि यह जितना आसान होगा:

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 धन्यवाद, मुझे लगता है कि मुझे इसका कारण मिला (अपडेट देखें), लेकिन समस्या को हल करने का तरीका नहीं।
लेव लेवित्स्की

क्या आपको हर समस्या का हल मिल गया? इसके अलावा, मैं आपको ध्यान देता हूं कि केवल कुछ जुड़ी इकाइयाँ मृत हैं। वे कौन से काम हैं, और वे कैसे भिन्न हैं?
स्पार्कवाक

@ शार्ख दुर्भाग्य से नहीं। वर्कअराउंड के रूप में, मैं बूट के बाद कई सेकंड के लिए सेट टाइमर का उपयोग करता हूं। प्रश्न का एक उदाहरण है: लिंक करने के बाद नेटवर्क-ऑनलाइन लक्ष्य सक्रिय है, और नेटवर्क लक्ष्य नहीं है।
लेव लेट्स्की

शायद मुझे गलतफहमी है, लेकिन मैं हर बार नेटवर्क को फिर से शुरू करने के लिए कुछ ढूंढ रहा हूं , सस्पेंड से फिर से शुरू करने के बाद अपने ईमेल की जांच करने के लिए। मैंने सोचा कि यह करने का तरीका होगा। अब मैं उदाहरण देख रहा हूं। मैंने सोचा था कि आप का मतलब है कि कुछ कस्टम सेवाओं को निकाल दिया गया और कुछ ने नहीं किया। हालाँकि, मैं देख रहा हूँ कि अब आप नेटवर्क लक्ष्य के उपयोगकर्ता संस्करणों के बारे में बात कर रहे हैं।
स्पार्कहॉक

जवाबों:


3

चूंकि आप एक सिस्टम सेवा पर निर्भर नहीं हो सकते हैं, आपका एकमात्र समाधान एक उपयोगकर्ता सेवा प्रदान करना है जो यह पता लगाता है कि नेटवर्क ऑनलाइन है या नहीं। (या अपनी सेवाओं को सिस्टम सर्विसेज बनाएं।) "डिटेक्ट-ऑनलाइन" उपयोगकर्ता सेवा के लिए विवरण "ऑनलाइन" की परिभाषा पर निर्भर करेगा। उदाहरण के लिए, यह सफल होने के लिए पिंग के लिए 8.8.8.8 तक प्रतीक्षा कर सकता है। या सफल होने के लिए DNS नाम रिज़ॉल्यूशन के लिए। उदाहरण के लिए, vpnc के साथ एक समान स्थिति में, मैं सफल होने के लिए vpn आईपी के लिए एक पिंग की प्रतीक्षा करता हूं।

फिर आप अपनी उपयोगकर्ता सेवाओं को अपनी खोज-ऑनलाइन उपयोगकर्ता सेवा पर (बाद में) निर्भर कर सकते हैं।

#!/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 उदाहरण होंगे, जो थोड़ा बेमानी लगता है। व्यवहार में यह संभवतः मुद्दा नहीं है, लेकिन मैं सभी उपयोगकर्ता सेवाओं के लिए एक "ऑनलाइन ध्वज" प्राप्त करने की आशा में यह पूछ रहा था। हालांकि अभी तक कोई बेहतर समाधान नहीं सुझाया गया है।
लेव लेटस्की

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

5
लेकिन यह एक प्रणाली सेवा है, और मैं एक उपयोगकर्ता सेवा स्थापित करने का प्रयास कर रहा हूं।
लेव लेवित्स्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.