子プロセスを「切り離す」ことは可能ですか?


10

私はbrowse-url/ を使用しbrowse-url-firefoxて、本質的にfirefoxによってURLで実行可能ファイルを実行するLinux(Fedora 23)の下のEmacs 24.5.1内からFirefoxでリンクを開きますstart-process。すでにFirefoxインスタンスが実行されている場合、これにより、URLが新しいタブで開かれ、firefoxEmacsから生成された実行可能ファイルが終了しますが、それ以外の場合、新しいFirefoxインスタンスはEmacsのプロセスの子として実行されます(テスト目的) 、これはM-! sleep 1h & RET)と同等です。

次にEmacsを終了したい場合は、「アクティブなプロセスが存在します。強制終了して、とにかく終了しますか?」Firefoxインスタンスを強制終了するか、Emacsを実行したままにするかを選択できます。代わりにfirefox、Firefoxインスタンスを実行したままEmacsを終了できるように、Emacs親からプロセスを「切り離す」ことを望みます。

Emacsから終了する「生き残る」Emacsからプロセスを生成することは可能ですか、またはEmacsの終了時に生成されたすべてのプロセスを終了させる必要がありますか?


EmacsをWindowsマシンで実行していますか?それは私が約2年前から答えを得られなかった問題に似ているように聞こえます- サブプロセスを殺すことなくEmacsからプロセスを削除する方法stackoverflow.com/q/19747637/2112489 たとえば、OSXでは、動作が異なります-つまり、start-process(pdfビューアのような)で外部アプリケーションを開くことができ、Emacsはそのジョブが終了したと考えています。
弁護士、2016年

いいえ、私はLinux(Fedora 23)を使用しています。それを反映するように質問を修正します。
Tim Landscheidt、2016年

回答:


3

ここに解決策があり、@ 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
                // ...
                ))

Macにはsetsidがないため、条件が必要であることに注意してください。


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 &")、既存のプロセスから「切り離す」ことは不可能であるため、私が答えを受け入れることができることを明示的に注記してください。
Tim Landscheidt、2016年

「setsid」は「nohup」よりも優れていると言われました。
YoungFrog 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.