可能“分离”子进程?


10

我使用browse-url/ browse-url-firefox从Linux(Fedora 23)下的Emacs 24.5.1内的Firefox中打开链接,该链接实质上是firefox通过URL 执行可执行文件的start-process。如果已经有一个Firefox实例在运行,这将导致该URL在新选项卡中打开并终止firefox从Emacs生成的可执行文件,但否则,一个新的Firefox实例将作为Emacs的进程子级运行(出于测试目的) ,等效于M-! sleep 1h & RET)。

如果然后我想退出Emacs,它会问我“活动进程存在;要杀死它们并继续退出吗?” 可以选择杀死Firefox实例,或者让Emacs运行。相反,我想将firefox进程与Emacs父进程“分离”,以便在保持Firefox实例运行的同时退出Emacs。

是否可以从Emacs产生“生存”退出Emacs的进程,或者必须在Emacs退出时所有产生的进程都死掉?


您是否有机会在Windows计算机上运行Emacs?这听起来类似于两年前我从未得到答案的问题-例如,如何在不终止子进程的情况下从Emacs中删除进程stackoverflow.com/q/19747637/2112489 例如,在OSX上,行为不同-即,我可以使用打开外部应用程序start-process(例如pdf查看器),而Emacs认为它的工作已经完成。
法律列表'16

不,我正在使用Linux(Fedora 23)。我将修正问题以反映这一点。
蒂姆·兰德谢特

Answers:


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没有setid。


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 &")并添加明确的注释,即无法从现有流程中“分离”出来,这样我才能接受答案?
蒂姆·兰德谢特

有人告诉我“ setsid”比“ nohup”要好。
YoungFrog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.