Có thể để tách ra một quá trình con?


10

Tôi sử dụng browse-url/ browse-url-firefoxđể mở các liên kết trong Firefox từ bên trong Emacs 24.5.1 trong Linux (Fedora 23) về bản chất thực thi việc firefoxthực thi với URL bằng start-process. Nếu đã có một phiên bản Firefox đang chạy, điều này sẽ khiến URL được mở trong một tab mới và chấm dứt firefoxthực thi được sinh ra từ Emacs, nhưng nếu không, một phiên bản Firefox mới sẽ chạy như một quá trình con của Emacs (cho mục đích thử nghiệm , điều này tương đương với M-! sleep 1h & RET).

Nếu sau đó tôi muốn thoát Emacs, nó sẽ hỏi tôi "Các quy trình hoạt động tồn tại; giết chúng và thoát ra bằng cách nào?" với tùy chọn giết phiên bản Firefox hoặc, tốt, hãy để Emacs chạy. Thay vào đó, tôi muốn "tách" firefoxquá trình từ cha mẹ Emacs để tôi có thể thoát Emacs trong khi vẫn giữ phiên bản Firefox chạy.

Có thể sinh ra các quá trình từ Emacs "sống sót" thoát khỏi Emacs, hoặc tất cả các quá trình sinh sản sẽ chết khi Emacs thoát ra?


Bạn có đang chạy Emacs trên máy Windows không? Nghe có vẻ giống như một vấn đề tôi chưa bao giờ có câu trả lời từ khoảng 2 năm trước - Cách xóa một quy trình khỏi Emacs mà không giết chết quy trình con : stackoverflow.com/q/19747637/2112361 Trên OSX, ví dụ, hành vi khác - tức là tôi có thể mở một ứng dụng bên ngoài bằng start-process(như trình xem pdf) và Emacs nghĩ rằng công việc của nó đã kết thúc.
luật

Không, tôi đang sử dụng Linux (Fedora 23). Tôi sẽ sửa đổi câu hỏi để phản ánh điều đó.
Tim Landscheidt

Câu trả lời:


3

đây là giải pháp, rút ​​ngắn câu trả lời của @ 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
                // ...
                ))

Lưu ý rằng điều kiện là cần thiết, vì Mac không có setsid.


1

Đây là một lệnh thực hiện những gì bạn muốn:

(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)

Điều quan trọng ở đây là sử dụng nohup.

Xem nguồn tại đây .


Cảm ơn! nohuplà một giải pháp tốt đẹp. Thật không may, tôi thấy câu trả lời của bạn quá "gây mất tập trung" cho một người chỉ tìm cách đạt được mục tiêu. Bạn có thể vui lòng cắt nguồn thành một cái gì đó như (shell-command "nohup sleep 1h &")và thêm một ghi chú rõ ràng rằng "tách" khỏi một quy trình hiện có là không thể để tôi có thể chấp nhận câu trả lời?
Tim Landscheidt

Tôi đã nói 'setsid' tốt hơn 'nohup'.
YoungFrog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.