¿Es posible "separar" un proceso secundario?

10

Utilizo browse-url/ browse-url-firefoxpara abrir enlaces en Firefox desde Emacs 24.5.1 en Linux (Fedora 23) que, en esencia, ejecuta el firefoxejecutable con la URL start-process. Si ya se está ejecutando una instancia de Firefox, esto a su vez hará que la URL se abra en una nueva pestaña y termine el firefoxejecutable generado desde Emacs, pero de lo contrario se ejecutará una nueva instancia de Firefox como un proceso hijo de Emacs (para fines de prueba , esto es equivalente a M-! sleep 1h & RET).

Si luego quiero salir de Emacs, me pregunta "¿Existen procesos activos; matarlos y salir de todos modos?" con la opción de eliminar la instancia de Firefox o, bueno, dejar Emacs ejecutándose En su lugar, me gustaría "separar" el firefoxproceso del padre Emacs para poder salir de Emacs mientras mantengo la instancia de Firefox en ejecución.

¿Es posible generar procesos de Emacs que "sobrevivan" al salir de Emacs, o todos los procesos generados deben morir cuando Emacs sale?

Tim Landscheidt
fuente
¿Está ejecutando Emacs en una máquina Windows por casualidad? Suena similar a un problema del que nunca recibí respuesta de hace aproximadamente 2 años: cómo eliminar un proceso de Emacs sin eliminar el subproceso : stackoverflow.com/q/19747637/2112489 En OSX, por ejemplo, el comportamiento es diferente - es decir, puedo abrir una aplicación externa con start-process(como un visor de pdf) y Emacs cree que su trabajo ha terminado.
ley
No, estoy usando Linux (Fedora 23). Enmendaré la pregunta para reflejar eso.
Tim Landscheidt

Respuestas:

3

Aquí está la solución, acortando la respuesta de @ 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
                // ...
                ))

Tenga en cuenta que la condición es necesaria, porque Mac no tiene setsid.

Xah Lee
fuente
1

Aquí hay un comando que hace lo que quieres:

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

La clave aquí es usar nohup.

Ver la fuente aquí .

abo-abo
fuente
¡Gracias! nohupEs una buena solución. Desafortunadamente, encuentro su respuesta demasiado "distractora" para alguien que solo está buscando cómo lograr el objetivo. ¿Podría reducir la fuente a algo así (shell-command "nohup sleep 1h &")y agregar una nota explícita de que "separar" de un proceso existente no es posible para que pueda aceptar la respuesta?
Tim Landscheidt
Me dijeron que 'setsid' era mejor que 'nohup'.
YoungFrog