인터넷 연결을 확인하는 코드 설명


13

Emacs를 열면 인터넷 연결을 통해 패키지 아카이브를 새로 고치는 것을 포함하여 init 파일을 평가합니다. 인터넷에 연결되어 있지 않으면 문제가되므로 인터넷에 연결하지 않고 Emacs를 시작할 때 해당 코드가 실행되지 않도록해야합니다. 이 문제를 해결하기 위해 인터넷에 연결되어 있지 않을 때 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를 시작할 때 패키지 아카이브를 새로 고치려는 이유는 무엇입니까?
phils

@Name 그 이상입니다. 그것은이다 (작동 가정) 대답.
Malabarba

1
시작할 때마다 package-refresh-contents를 실행하지 않는 것이 좋습니다. 새 컴퓨터에서 구성을 처음 풀다운 할 때 한 번만 실행하면 몇 달 동안 다시 구성 할 필요가 없습니다. 연결이있을 때 연결하는 것이이 문제에 대한 오답입니다. 실제 문제는 필요하지 않을 때 연결을 실행한다는 것입니다.
Jordon Biondo

답변:


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
이것은 또한 큰 보이지 않는 버퍼의 무리를 만드는 것, 그것이 가장 잘 할 (죽일 버퍼 (URL-RET ...)) 것
조던 Biondo

@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"

간단하고 빠르며 더 넓은 인터넷 연결을 테스트하기 때문에이 솔루션을 가장 좋아합니다.
miguelmorin 2016 년

4

당신이 시도 할 수있는 한 가지는 기능 network-interface-list입니다. 네트워크 인터페이스 목록과 해당 IP 주소를 반환합니다.

나에게 이것은 이더넷과 와이파 이에 모두 연결되었을 때 반환되는 것입니다.

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

Wi-Fi를 끄면 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]))이더넷에 연결되어 있기 때문에 얻는다 .
Kaushal Modi

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인터페이스와 VirtualBox 및 Docker 인터페이스 를 제외 합니다. 도움이 되길 바랍니다.

(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가있는 최신 Linux 시스템에서 :

(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..))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.