Possible de «détacher» un processus enfant?


10

J'utilise browse-url/ browse-url-firefoxpour ouvrir des liens dans Firefox depuis Emacs 24.5.1 sous Linux (Fedora 23) qui exécute essentiellement l' firefoxexécutable avec l'URL par start-process. S'il existe déjà une instance de Firefox en cours d'exécution, cela entraînera à son tour l'URL à ouvrir dans un nouvel onglet et mettra fin à l' firefoxexécutable généré à partir d'Emacs, mais sinon une nouvelle instance de Firefox s'exécutera en tant qu'enfant de processus d'Emacs (à des fins de test , cela équivaut à M-! sleep 1h & RET).

Si je veux ensuite quitter Emacs, il me demande "Des processus actifs existent, les tuer et quitter quand même?" avec l'option de tuer l'instance de Firefox ou bien de laisser Emacs en cours d'exécution. Au lieu de cela, je voudrais «détacher» le firefoxprocessus du parent Emacs afin de pouvoir quitter Emacs tout en gardant l'instance de Firefox en cours d'exécution.

Est-il possible de générer des processus à partir d'Emacs qui "survivent" à la sortie d'Emacs, ou tous les processus générés doivent-ils mourir à la sortie d'Emacs?


Utilisez-vous Emacs sur une machine Windows par hasard? Cela ressemble à un problème auquel je n'ai jamais eu de réponse il y a environ 2 ans - Comment supprimer un processus d'Emacs sans tuer le sous-processus : stackoverflow.com/q/19747637/2112489 Sur OSX, par exemple, le comportement est différent - c'est-à-dire que je peux ouvrir une application externe avec start-process(comme une visionneuse PDF) et Emacs pense que son travail est terminé.
Lawlist

Non, j'utilise Linux (Fedora 23). Je vais modifier la question pour refléter cela.
Tim Landscheidt

Réponses:


3

voici la solution, court-circuitant la réponse 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
                // ...
                ))

Notez que cette condition est nécessaire, car Mac n'a pas setsid.


1

Voici une commande qui fait ce que vous voulez:

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

L'essentiel ici est d'utiliser nohup.

Voir la source ici .


Merci! nohupest une bonne solution. Malheureusement, je trouve votre réponse trop "distrayante" pour quelqu'un qui cherche simplement comment atteindre l'objectif. Pourriez-vous s'il vous plaît réduire la source à quelque chose comme (shell-command "nohup sleep 1h &")et ajouter une note explicite que "détacher" d'un processus existant n'est pas possible afin que je puisse accepter la réponse?
Tim Landscheidt

On m'a dit que «setsid» valait mieux que «nohup».
YoungFrog
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.