इंटरनेट कनेक्शन की जाँच करने के लिए एलिसिप कोड


13

जब मैं Emacs खोलता हूं, तो यह मेरी init फ़ाइल का मूल्यांकन करता है, जिसमें इंटरनेट कनेक्शन के माध्यम से मेरे पैकेज अभिलेखागार को ताज़ा करना शामिल है। यह समस्याग्रस्त है जब मेरे पास इंटरनेट कनेक्शन नहीं है, इस प्रकार मुझे इंटरनेट कनेक्शन के बिना एमएसीएस शुरू करते समय उस कोड के निष्पादन को रोकने की आवश्यकता है। इस समस्या को हल करने के लिए, मुझे आश्चर्य है कि अगर इंटरनेट कनेक्शन नहीं होने पर Emacs के पास पैकेज रिफ्रेश कोड को अनदेखा करने का कोई तरीका है?

यहाँ मेरी पहली कुछ पंक्तियाँ हैं init.el:

;; Requisites: Emacs >= 24
(require 'package)
(package-initialize)

;; PACKAGE MANAGEMENT
(add-to-list 'package-archives 
  '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-refresh-contents)       

मुझे लगता है कि मैं अपने Emacs फ़ाइल को लोड करने के लिए कोड जोड़ सकता हूं:

;; Requisites: Emacs >= 24
(when (connected-to-internet-p)   ; I need this predicate function
  (require 'package)
  (package-initialize)
  (add-to-list 'package-archives 
               '("melpa" . "http://melpa.milkbox.net/packages/") t)
  (package-refresh-contents))

क्या (connected-to-internet)इस समस्या को हल करने के लिए कोई फ़ंक्शन या समान दृष्टिकोण है?


2
यहाँ एक संबंधित जवाब है stackoverflow.com/a/21065704/3170376
नाम

2
जब आप Emacs शुरू करते हैं तो आप पैकेज अभिलेखागार को ताज़ा क्यों करना चाहते हैं?
फिल्स

@ नाम जो संबंधित से अधिक है। यह जवाब (यह मानते हुए यह काम करता है)।
मालाबार

1
मैं दृढ़ता से सलाह दूंगा कि आप प्रत्येक स्टार्टअप पर पैकेज-रिफ्रेश-कंटेंट न चलाएं। यह सबसे अधिक संभावना है कि जब आप पहली बार एक नई मशीन पर अपने कॉन्फिगरेशन को नीचे खींच रहे हैं तो आपको इसे एक बार चलाने की आवश्यकता होगी और फिर आपको महीनों तक इसकी आवश्यकता नहीं होगी। ऐसा करना जब आपके पास कनेक्शन है तो इस समस्या का गलत उत्तर है, वास्तविक समस्या यह है कि आप इसे तब चला रहे हैं जब आपको इसकी आवश्यकता नहीं है।
जॉर्डन बियोनडो

जवाबों:


7

ठीक है, अगर आप अभी भी स्वचालित रूप से सामग्री को ताज़ा करना चाहते हैं, जब भी संभव हो, आप नीचे दिए गए कोड की तरह कुछ कर सकते हैं:

(defun can-retreive-packages ()
  (cl-loop for url in '("http://marmalade-repo.org/packages/"
                        "http://melpa.milkbox.net/packages/"
                        "http://elpa.gnu.org/packages/")
           do (condition-case e
                  (kill-buffer (url-retrieve-synchronously url))
                (error (cl-return)))
           finally (cl-return t)))

कुछ नोट बकाया हैं:

  1. यह धीमा है, और सामान्य रूप से शुरू होने पर यह धीमा होगा, इसलिए मैं इसे मैन्युअल रूप से करता हूं।
  2. सामान्य रूप से इंटरनेट कनेक्शन के लिए परीक्षण करने का कोई तरीका नहीं है। आप केवल यह जान सकते हैं कि आप कुछ समय के बाद किसी विशेष सेवा से जुड़ने में सक्षम नहीं हैं। यह भी एक कारण है कि यह इतना धीमा क्यों है।
  3. कोड समस्या का दृष्टिकोण करने के तरीके का अधिक चित्रण है। आप आसानी से कर सकते हैं (ignore-errors (package-refresh-contents))अगर आपको परवाह नहीं है कि यह सफल हुआ या नहीं।

यह स्पष्ट रूप से इसे करने का सही तरीका है। किसी भी समय, इंटरनेट के कुछ हिस्से सुलभ हैं और कुछ नहीं हैं, और इससे निपटने का उचित तरीका कनेक्टिविटी के लिए जांच करना है।
jch

1
यह बड़े अनदेखी बफ़र्स का एक समूह भी बनाएगा, यह सबसे अच्छा होगा (किल-बफर (यूआरएल-रिट ...)
जॉर्डन बियोनडो

@JordonBiondo ठीक है, बिंदु लिया गया। इसके बारे में सोचा नहीं था।
wvxvw

6

एक सरल समाधान जो मैंने अपनी शेल स्क्रिप्ट से अपनाया है

(defun internet-up-p (&optional host)
    (= 0 (call-process "ping" nil nil nil "-c" "1" "-W" "1" 
                       (if host host "www.google.com"))))

आप इसे *scratch*बफर में टेस्ट कर सकते हैं :

(message (if (internet-up-p) "Up" "Down"))
"Up"

मुझे यह समाधान सबसे अधिक पसंद है क्योंकि यह सरल, तेज़ है, और व्यापक इंटरनेट से कनेक्शन का परीक्षण करता है।
मिगेलमोरिन

4

एक चीज जो आप आजमा सकते हैं, वह है फंक्शन network-interface-list। यह नेटवर्क इंटरफेस और उनके आईपी पते का एक विवरण देता है।

मेरे लिए, यह तब होता है जब मैं ईथरनेट और वाईफाई दोनों से जुड़ा होता हूं:

(("en5" .
  [10 151 0 63 0])
 ("en0" .
  [10 151 2 76 0])
 ("lo0" .
  [127 0 0 1 0]))

और जब मैं वाईफाई बंद करता हूं, en0गायब हो जाता है:

(("en5" .
  [10 151 0 63 0])
 ("lo0" .
  [127 0 0 1 0]))

उस के साथ प्रयोग करें और देखें कि जब आपके पास इंटरनेट कनेक्शन नहीं है तो आपको क्या मिलेगा। उदाहरण के लिए, पैकेज को केवल ताज़ा करने के लिए, en0कुछ ऐसा करें:

(when (assoc "en0" (network-interface-list))
  (package-refresh-contents))

यह एक दिलचस्प कार्य है। मुझे मिलता है (("eth0" . [10 72 153 234 0]) ("lo" . [127 0 0 1 0]))क्योंकि मैं ईथरनेट से जुड़ा हुआ हूं।
कौशल मोदी

3

लेगोशिया के उत्तर पर विस्तार करने के लिए:

(defun test-internet ()
  (remove-if (lambda (el)
                   (string-match-p "lo.*" (car el)))
                 (network-interface-list)))

यह सक्रिय नेटवर्क कनेक्शन की एक सूची लौटाएगा ( lo.*लूपबैक इंटरफ़ेस है, कुछ मामलों loमें दूसरों में lo#

यदि परीक्षण लौटता है non-nil, तो एक नेटवर्क कनेक्शन है (वाईफाई / ईथरनेट, कोई गारंटी नहीं है कि यह वास्तव में बाहरी इंटरनेट तक पहुंचता है। लेकिन इसके लिए परीक्षण के रूप में कहीं पिंग करना होगा), अगर यह वापस आता है nilतो पैकेज को पुनः प्राप्त करने का कोई तरीका नहीं है। सूची।


2

मैं loopbackइंटरफेस और वर्चुअलबॉक्स और डॉकर इंटरफेस को बाहर करने के लिए निम्नलिखित का उपयोग करता हूं । मुझे आशा है कि यह उपयोगी है।

(defun tzz-has-network ()
  (remove-if (lambda (i)
               (or (string-match-p "\\(vboxnet\\|docker\\).*" i)
                   (member 'loopback (nth 4 (network-interface-info i)))))
             (mapcar 'car (network-interface-list))))

2

DBus और NetworkManager के साथ एक आधुनिक लिनक्स सिस्टम पर:

(defun nm-is-connected()
  (equal 70 (dbus-get-property
             :system "org.freedesktop.NetworkManager" "/org/freedesktop/NetworkManager"
             "org.freedesktop.NetworkManager" "State")))

1

मुझे लगता है कि आप इसे गलत तरीके से देख रहे हैं। यदि आप वास्तव में अपने पैकेज को ऑटो-अपडेट करना चाहते हैं, तो इसे स्टार्टअप पर सिंक्रोनाइज़ न करें: इसे किसी प्रकार के निष्क्रिय टाइमर से करें। उदाहरण के लिए

(run-with-idle-timer 10 nil
  (lambda ()
    (package-refresh-contents)
    ..etc..))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.