Möglich, einen untergeordneten Prozess zu "trennen"?


10

Ich verwende browse-url/ browse-url-firefox, um Links in Firefox in Emacs 24.5.1 unter Linux (Fedora 23) zu öffnen, das im Wesentlichen die firefoxausführbare Datei mit der URL von ausführt start-process. Wenn bereits eine Firefox-Instanz ausgeführt wird, wird die URL in einem neuen Tab geöffnet und die firefoxvon Emacs erzeugte ausführbare Datei beendet. Andernfalls wird eine neue Firefox-Instanz als untergeordnetes Prozesselement von Emacs ausgeführt (zu Testzwecken) , das entspricht M-! sleep 1h & RET).

Wenn ich dann Emacs beenden möchte, werde ich gefragt, ob aktive Prozesse vorhanden sind. Beenden Sie sie und beenden Sie sie trotzdem. mit der Option, entweder die Firefox-Instanz zu beenden oder Emacs laufen zu lassen. Stattdessen möchte ich den firefoxProzess vom übergeordneten Emacs-System "trennen", damit ich Emacs beenden kann, während die Firefox-Instanz ausgeführt wird.

Ist es möglich, Prozesse aus Emacs zu erzeugen, die das Verlassen von Emacs "überleben", oder müssen alle erzeugten Prozesse sterben, wenn Emacs beendet wird?


Führen Sie Emacs zufällig auf einem Windows-Computer aus? Es klingt ähnlich wie ein Problem, auf das ich vor ungefähr 2 Jahren keine Antwort bekommen habe - So löschen Sie einen Prozess aus Emacs, ohne den Unterprozess zu beenden : stackoverflow.com/q/19747637/2112489 Unter OSX ist das Verhalten beispielsweise anders - dh ich kann eine externe Anwendung mit start-process(wie einem PDF-Viewer) öffnen und Emacs glaubt, dass der Job beendet ist.
Lawlist

Nein, ich verwende Linux (Fedora 23). Ich werde die Frage ändern, um dies widerzuspiegeln.
Tim Landscheidt

Antworten:


3

Hier ist eine Lösung, die die Antwort von @ abo-abo kurzschließt.

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

Beachten Sie, dass eine Bedingung erforderlich ist, da der Mac keine Setsid hat.


1

Hier ist ein Befehl, der macht, was Sie wollen:

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

Der Schlüssel hier ist zu verwenden nohup.

Siehe die Quelle hier .


Vielen Dank! nohupist eine schöne Lösung. Leider finde ich Ihre Antwort zu "ablenkend" für jemanden, der nur danach sucht, wie er das Ziel erreichen kann. Könnten Sie bitte die Quelle auf etwas reduzieren (shell-command "nohup sleep 1h &")und einen expliziten Hinweis hinzufügen, dass ein "Trennen" von einem vorhandenen Prozess nicht möglich ist, damit ich die Antwort akzeptieren kann?
Tim Landscheidt

Mir wurde gesagt, "setsid" sei besser als "nohup".
YoungFrog
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.