เป็นไปได้ที่จะ "แยก" กระบวนการเด็กหรือไม่?


10

ผมใช้browse-url/ browse-url-firefoxการเปิดการเชื่อมโยงใน Firefox จากภายใน Emacs 24.5.1 ภายใต้ Linux (Fedora 23) ซึ่งในสาระสำคัญดำเนินการfirefoxปฏิบัติการที่มี URL start-processโดย หากมีการใช้งานอินสแตนซ์ของ Firefox อยู่แล้วนี่จะทำให้ URL ถูกเปิดในแท็บใหม่และยุติการfirefoxปฏิบัติการที่เกิดจาก Emacs แต่มิฉะนั้นอินสแตนซ์ Firefox ใหม่จะทำงานเป็นกระบวนการย่อยของ Emacs (สำหรับวัตถุประสงค์ในการทดสอบ สิ่งนี้เทียบเท่ากับM-! sleep 1h & RET)

ถ้าฉันต้องการออกจาก Emacs มันจะถามฉันว่า "มีกระบวนการที่ใช้งานอยู่; ด้วยตัวเลือกเพื่อฆ่าอินสแตนซ์ Firefox หรือปล่อยให้ Emacs ทำงาน แต่ฉันอยากจะ "แยก" firefoxกระบวนการจากผู้ปกครอง Emacs เพื่อให้ฉันสามารถออกจาก Emacs ขณะที่ยังคงอินสแตนซ์ Firefox ที่ทำงานอยู่

เป็นไปได้หรือไม่ที่จะวางไข่กระบวนการจาก Emacs ที่ "เอาตัวรอด" ออกจาก Emacs หรือกระบวนการเกิดใหม่ทั้งหมดจะต้องตายเมื่อ Emacs ออกจากการทำงานหรือไม่


คุณใช้ Emacs บนเครื่อง Windows โดยบังเอิญหรือไม่? ฟังดูคล้ายกับปัญหาที่ฉันไม่เคยได้รับคำตอบเมื่อประมาณ 2 ปีที่แล้ว - วิธีการลบโพรเซสจาก Emacs โดยไม่ฆ่าโพรเซสย่อย : stackoverflow.com/q/19747637/2112489 บน OSX ตัวอย่างเช่นพฤติกรรมแตกต่างกัน - เช่นฉันสามารถเปิดแอปพลิเคชันภายนอกด้วยstart-process(เช่นโปรแกรมดูไฟล์ PDF) และ Emacs คิดว่างานของมันเสร็จสิ้นแล้ว
กฎหมาย

ไม่ฉันใช้ Linux (Fedora 23) ฉันจะแก้ไขคำถามเพื่อสะท้อนว่า
Tim Landscheidt

คำตอบ:


3

นี่คือทางออกของ shorting @ คำตอบของ 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

ฉันบอกว่า 'setsid' ดีกว่า 'nohup'
YoungFrog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.