डेबियन systemd network-online.target काम नहीं कर रहा है?


24

मैं डेबियन जेसी पर एक सिस्टमड सर्विस बनाने की कोशिश कर रहा हूं। मेरे network-online.targetपहुंचने के बाद इसे शुरू करने की आवश्यकता है।

यह समस्या network-online.targetउसी समय की है जब तक network.targetऔर उस समय मेरे इंटरफेस अभी तक कॉन्फ़िगर नहीं किए गए हैं, बस डीएचसीपी क्वेरी शुरू हुई।

ऐसा लगता है कि यह मुद्दा डेबियन के लिए विशिष्ट है क्योंकि यह विरासत नेटवर्क कॉन्फ़िगरेशन का उपयोग करता है।

इस समस्या को कैसे दरकिनार किया जाए या कैसे network-online.targetकाम किया जाए?


का आउटपुट क्या है systemctl list-dependencies network-online.target? इसके अलावा, ध्यान दें कि network-online.targetआवश्यक नहीं हो सकता है कि इंटरनेट का उपयोग हो। अधिक जानकारी के लिए इस पृष्ठ को देखें ।
सियारकोट Jul५१

कमांड का आउटपुट है: network-online.target ● └─systemd-networkd-wait-online.service मैंने उस पृष्ठ को पहले ही पढ़ लिया है, मैं वहां की मूल अवधारणा को समझता हूं, लेकिन फिर भी कोई परिभाषित बिंदु नहीं होना बहुत अजीब है जहां नेटवर्क महत्वपूर्ण सेवाएं शुरू हो सकती हैं। कम से कम यह उचित डीएचसीपी के लिए इंतजार कर सकता है।
10robinho

इसका मतलब यह है कि यह network-online.targetकेवल इस बात पर निर्भर करता है systemd-networkd-wait-online.serviceकि यह तैयार है। यह NetworkManager पर निर्भर नहीं है कि यह तैयार है, और न ही जाँच करें कि ifupसभी लिंक सफलतापूर्वक आए (यदि आप अपने नेटवर्क को कॉन्फ़िगर करने के लिए उस पद्धति का उपयोग करते हैं)। दूसरी ओर, Ubuntu पर ifupऔर NetworkManager पर निर्भर करता है , लेकिन इसके लिए नहीं systemd-networkd-wait-online.
सियारकोट Jul५

: कैसे आप अपने नेटवर्क कॉन्फ़िगर कर रहे हैं /etc/network/interfaces, systemd .networkफ़ाइलें, या NetworkManager?
सियारकोट Jul५

आप सही हैं, network-online.targetऔर network.targetइसके ठीक बाद ट्रिगर हैं ifup। मैं डेबियन डिफ़ॉल्ट का उपयोग करता हूं, इसलिए /etc/network/interfacesdhcp पते के साथ। ऐसा लगता है कि नेटवर्कड बेहतर समाधान हो सकता है, लेकिन इसे लागू करना सीधा नहीं है।
10robinho

जवाबों:


18

जब से आप उपयोग कर रहे हैं /etc/network/interfaces, आपको प्रत्येक इंटरफ़ेस की स्थिति की निगरानी के लिए एक systemd सेवा की आवश्यकता होगी। यह देखने के लिए जांचें कि क्या आपके पास /lib/systemd/system/ifup-wait-all-auto.service( ifupdownउबंटू 15.04 में पैकेज द्वारा स्थापित ) है। यदि नहीं, तो बनाएँ /etc/systemd/system/ifup-wait-all-auto.service, और निम्नलिखित में पेस्ट करें:

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

यह उबंटू 15.04 सिस्टम पर मौजूद सर्विस फाइल है, लेकिन [Install]चीजों को थोड़ा आसान बनाने के लिए इसमें जोड़े गए सेक्शन के साथ । मुझे उम्मीद है कि ifupउबंटू 15.04 का व्यवहार ifupडेबियन जेसी के व्यवहार के समान है । यदि नहीं, तो कुछ संशोधन आवश्यक होगा (विशेषकर अंतिम पंक्ति के साथ)।

फिर, भागो sudo systemctl enable ifup-wait-all-auto.service। अपने कंप्यूटर को रिबूट करने के बाद, आपको यह देखना चाहिए कि network-online.targetइंटरफेस को ऊपर लाने के बाद (कम से कम) पहुंच गया है।


प्रयास के लिए धन्यवाद, मुझे अभी कोशिश करने दो और मैं आपको प्रतिक्रिया दूंगा
10robinho

मैंने थोड़ा संशोधित संस्करण चलाना समाप्त कर दिया है ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'। यह hostnameजांचने के लिए पर निर्भर करता है कि क्या आईपी पता सौंपा गया है।
लुका 5z

स्पिन डॉक्टर की कोशिश मत करो। ऐसा नहीं है क्योंकि वह / etc / network / interfaces का उपयोग कर रहा है। ऐसा इसलिए है क्योंकि systemd इतना टेढ़ा है और जहां इसे बनाया गया था, उस समस्या को हल करने के बजाय प्रत्येक उपयोगकर्ता के लिए यह कार्य बंद है।
फ्लोरियन हीगल

1
fwiw, को संस्करण ifup-wait-all-auto.serviceमें छोड़ दिया गया है : “ifup-Wait-all-auto.service ड्रॉप करें। इसे नेटवर्क-ifupdown0.8.5ubuntu1
online.target

0

ध्यान! बस इसे एक रस्पियन जेसी पर लगा दिया: सभी टिप्पणी लाइनों को हटा दें / etc / नेटवर्क इंटरफेस में और यह काम करेगा! यह एक पार्सिंग बग प्रतीत होता है =) मेरे विशिष्ट मामले में मैंने टिप्पणी छोड़ दी है iface eth0 inet dhcpऔर बस इसके बारे में पहले ही भूल गया था, लेकिन रास्पियन जेसी को अपग्रेड करने और एक कर्नेल के पुनर्निर्माण के बाद मुझे बहुत अजीब व्यवहार मिला है: इसने डीएचसीपी का इस्तेमाल किया और इनकार कर दिया। / etc / नेटवर्क / इंटरफेस से ट्यूनिंग करें। इसलिए मैंने इसे किसी भी टिप्पणी से हटा दिया है - बस काम करने वाली लाइनें, रिबूट - और यह काम करता है! कोई SCRIPT PATCHING / संपादन की आवश्यकता है!


इंटरेस्टिन, मुझे यह कोशिश करने की आवश्यकता है। हालाँकि यह बहुत मायने नहीं रखता है :)
10robinho

2
क्या आपके पास इसके बारे में कोई संदर्भ है? मैं बग रिपोर्ट (ओं) को पढ़ना चाहता हूं और छोटी गाड़ी कोड देखना चाहता हूं।
22

नहीं, मैंने बग टिकट नहीं खोला है। इसे पुन: उत्पन्न करने के लिए अपनी /etc/network/interfacesफ़ाइल में कुछ टिप्पणियां जोड़ें - अगर यह अभी भी है तो यह आग लग जाएगी।
अलेक्सी वेसन

0

Https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ प्रति सेवा शुरू करने के लिए अनुशंसित तरीका AFTER नेटवर्किंग स्तर है .service फ़ाइल में " network-online.target " का उपयोग करना।

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

हालाँकि " network-online.target " और मेरी सेवा विफल होने के बाद क्योंकि नेटवर्किंग पूरी तरह से स्तरीय नहीं थी, मुझे पता चला कि इसके साथ एक बग ( https://github.com/coreos/bugs/issues/1966 ) है: इसकी गारंटी नहीं है 100% अचूक हो।

दरअसल, जहां इस तरह के "के रूप में गतिशील नेटवर्किंग विन्यास उपकरण NetworkManager " इस मामले में के रूप में उपयोग किया जाता है, नेटवर्किंग के राज्य कभी नहीं 100% सटीक या उम्मीद के मुताबिक हो सकता है। बग का वर्णन करने वाले लिंक से स्पष्ट रूप से, " network-online.target " का उपयोग विभिन्न अनुप्रयोगों के आधार पर असंगत व्यवहार कर सकता है।

वर्कअराउंड :
आपको सेवाओं के स्टार्ट-अप ऑर्डर का विश्लेषण करने और " नेटवर्क-online.target " की तुलना में बाद में शुरू होने वाले एक का उपयोग करने की आवश्यकता है :

 systemd-analyze plot > /home/pi/graph.svg

यह एक पुनरावृत्तीय प्रक्रिया है, जब तक आप नेटवर्किंग को सुनिश्चित करने वाले स्तर को नहीं पा लेते, तब तक बाद में और बाद की सेवाओं में लक्ष्यों को बढ़ाते हुए, आपकी सेवा बिना किसी त्रुटि के शुरू होती है। मेरे स्वयं के मामले में मुझे भी sleep 10अपनी स्क्रिप्ट को SystemD सेवा में डालनी पड़ी।


0

मुझे एक बार जीथब पर एक उत्तर मिला जिसने एक सर्वर को पिंग करने की लगातार कोशिश करके इसे हल किया। पिंग के माध्यम से आने पर ही सेवा जारी रहती है:

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

मैंने google.comअपने सर्वर से बदल दिया क्योंकि मेरे मुख्य स्क्रिप्ट को अपने सर्वर से कनेक्ट करने की आवश्यकता थी।

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