Можливо "від'єднати" дитячий процес?


10

Я використовую browse-url/ browse-url-firefoxдля відкриття посилань у Firefox з Emacs 24.5.1 під Linux (Fedora 23), який, по суті, виконує firefoxвиконуваний файл з URL start-process. Якщо вже запущений екземпляр Firefox, це, в свою чергу, призведе до відкриття URL-адреси на новій вкладці та припинення firefoxвиконуваного файлу, породженого з Emacs, але в іншому випадку новий екземпляр Firefox запускається як дочірній процес Emacs (для тестування) , це рівнозначно M-! sleep 1h & RET).

Якщо я хочу вийти з Emacs, він запитує мене "Активні процеси існують; вбити їх і все одно вийти?" з можливістю або вбити екземпляр Firefox, або, добре, залишити Emacs запущеним. Натомість я хотів би "від'єднати" firefoxпроцес від батьків Emacs, щоб я міг вийти з Emacs, зберігаючи примірник Firefox.

Чи можливо нерестувати процеси з Emacs, які "виживають" при виході з Emacs, або всі породжені процеси відмирають, коли Emacs закінчується?


Ви запускаєте Emacs на машині Windows випадково? Це схоже на питання, на який я жодного разу не отримав відповіді близько 2 років тому - Як видалити процес з Emacs, не вбиваючи підпроцес : stackoverflow.com/q/19747637/2112489 На OSX, наприклад, поведінка відрізняється - тобто я можу відкрити зовнішню програму start-process(наприклад, у переглядачі PDF), і Emacs вважає, що її робота закінчена.
законник

Ні, я використовую Linux (Fedora 23). Я зміню питання, щоб це відобразити.
Тім Ландшайдт

Відповіді:


3

ось рішення, короткий відповідь @ Або-Або.

(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 немає встановленого setid.


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 &")та додати явну примітку, що "від'єднання" від існуючого процесу неможливо, щоб я міг прийняти відповідь?
Тім Ландшайдт

Мені сказали, що "setid" - краще, ніж "nohup".
ЯнгФрог
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.