자식 프로세스를 "분리"할 수 있습니까?


10

browse-url/ browse-url-firefox를 사용 하여 Linux (Fedora 23)의 Emacs 24.5.1에서 Firefox의 링크를 열면 본질적으로 firefoxURL로 실행 파일을 실행합니다 start-process. 이미 Firefox 인스턴스가 실행중인 경우 URL이 새 탭에서 열리고 firefoxEmacs에서 생성 된 실행 파일이 종료 되지만 새 Firefox 인스턴스는 테스트 목적으로 Emacs의 프로세스 하위로 실행됩니다. M-! sleep 1h & RET) 와 같습니다 .

그런 다음 Emacs를 종료하려면 "활성 프로세스가 존재합니다. 프로세스를 종료 한 다음 종료 하시겠습니까?" Firefox 인스턴스를 종료하거나 Emacs를 계속 실행하는 옵션이 있습니다. 대신 firefoxFirefox 인스턴스를 계속 실행하면서 Emacs를 종료 할 수 있도록 Emacs 상위 프로세스 를 "분리"하고 싶습니다 .

Emacs를 종료하는 "생존"하는 Emacs에서 프로세스를 생성 할 수 있습니까? 아니면 Emacs가 종료 될 때 생성 된 모든 프로세스가 죽어야합니까?


Windows 시스템에서 Emacs를 실행하고 있습니까? 그것은 약 2 년 전에 대답을 얻지 못한 문제와 비슷하게 들립니다- 하위 프로세스를 종료하지 않고 Emacs에서 프로세스를 삭제하는 방법 : stackoverflow.com/q/19747637/2112489 OSX의 경우 동작이 다릅니다 즉, start-processpdf 뷰어와 같은 외부 응용 프로그램을 열 수 있으며 Emacs는 작업이 끝났다고 생각합니다.
lawlist

아니요, 저는 Linux (Fedora 23)를 사용하고 있습니다. 이를 반영하여 질문을 수정하겠습니다.
Tim Landscheidt

답변:


3

여기에 해결책이 있습니다. @ abo-abo의 대답을 짧게하십시오.

(cond
     ((string-equal system-type "windows-nt") ; Windows
      // ...
      )
     ((string-equal system-type "gnu/linux")
      (start-process "my-browse"
                     nil "setsid"
                     "firefox"
                     (concat "file://" buffer-file-name ))

      ;; (browse-url ξurl)
      )
     ((string-equal system-type "darwin") ; Mac
                // ...
                ))

Mac에는 setsid가 없기 때문에 조건이 필요합니다.


1

원하는 것을 수행하는 명령은 다음과 같습니다.

(defun ora-dired-start-process (cmd &optional file-list)
  (interactive
   (let ((files (dired-get-marked-files
                 t current-prefix-arg)))
     (list
      (unless (eq system-type 'windows-nt)
        (dired-read-shell-command "& on %s: "
                                  current-prefix-arg files))
      files)))
  (if (eq system-type 'windows-nt)
      (dolist (file file-list)
        (w32-shell-execute "open" (expand-file-name file)))
    (let (list-switch)
      (start-process
       cmd nil shell-file-name
       shell-command-switch
       (format
        "nohup 1>/dev/null 2>/dev/null %s \"%s\""
        (if (and (> (length file-list) 1)
                 (setq list-switch
                       (cadr (assoc cmd ora-dired-filelist-cmd))))
            (format "%s %s" cmd list-switch)
          cmd)
        (mapconcat #'expand-file-name file-list "\" \""))))))

(define-key dired-mode-map "r" 'ora-dired-start-process)

여기서 중요한 것은를 사용하는 것 nohup입니다.

여기 소스를 참조 하십시오 .


감사! nohup좋은 해결책입니다. 불행히도 나는 목표를 달성하는 방법을 찾는 누군가에게 당신의 대답이 너무 산만하다는 것을 알았습니다. 소스를 잘라 내고 (shell-command "nohup sleep 1h &")기존 프로세스에서 "분리"할 수 없다는 명시적인 메모를 추가하여 답변을 수락 할 수 있습니까?
Tim Landscheidt

나는 'setsid'가 'nohup'보다 낫다는 말을 들었다.
YoungFrog
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.