È possibile "staccare" un processo figlio?


10

Uso browse-url/ browse-url-firefoxper aprire collegamenti in Firefox dall'interno di Emacs 24.5.1 sotto Linux (Fedora 23) che in sostanza esegue l' firefoxeseguibile con l'URL di start-process. Se è già in esecuzione un'istanza di Firefox, ciò a sua volta causerà l'apertura dell'URL in una nuova scheda e la chiusura firefoxdell'eseguibile generato da Emacs, ma in caso contrario verrà eseguita una nuova istanza di Firefox come figlio figlio di Emacs (a scopo di test , questo equivale a M-! sleep 1h & RET).

Se poi voglio uscire da Emacs, mi chiede "Esistono processi attivi; ucciderli ed uscire comunque?" con l'opzione di uccidere l'istanza di Firefox o, beh, lasciare Emacs in esecuzione. Vorrei invece "staccare" il firefoxprocesso dal genitore Emacs in modo da poter uscire da Emacs mantenendo l'istanza di Firefox in esecuzione.

È possibile generare processi da Emacs che "sopravvivono" all'uscita da Emacs o devono morire tutti i processi generati quando Emacs esce?


Stai eseguendo Emacs su un computer Windows per caso? Sembra simile a un problema a cui non ho mai avuto risposta da circa 2 anni fa - Come eliminare un processo da Emacs senza uccidere il sottoprocesso : stackoverflow.com/q/19747637/2112489 Su OSX, ad esempio, il comportamento è diverso - Cioè, posso aprire un'applicazione esterna con start-process(come un visualizzatore di pdf) ed Emacs pensa che il suo lavoro sia finito.
elenco delle leggi del

No, sto usando Linux (Fedora 23). Modificherò la domanda per riflettere ciò.
Tim Landscheidt,

Risposte:


3

ecco la soluzione, mettendo in corto la risposta di @ 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
                // ...
                ))

Nota che la condizione è necessaria, perché il Mac non ha setsid.


1

Ecco un comando che fa quello che vuoi:

(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 cosa chiave qui è usare nohup.

Vedi la fonte qui .


Grazie! nohupè una bella soluzione. Purtroppo trovo la tua risposta troppo "fonte di distrazione" per qualcuno che sta solo cercando come raggiungere l'obiettivo. Potresti per favore ridurre la fonte a qualcosa di simile (shell-command "nohup sleep 1h &")e aggiungere una nota esplicita che "staccare" da un processo esistente non è possibile in modo che io possa accettare la risposta?
Tim Landscheidt,

Mi è stato detto che "setsid" era meglio di "nohup".
YoungFrog,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.