एक बच्चे की प्रक्रिया को "अलग" करना संभव है?


10

मैं लिनक्स (फेडोरा 23) के तहत Emacs 24.5.1 के भीतर फ़ायरफ़ॉक्स में लिंक खोलने के लिए browse-url/ browse-url-firefoxका उपयोग करता हूं, जो संक्षेप firefoxमें URL के साथ निष्पादन योग्य निष्पादित करता है start-process। यदि पहले से ही फ़ायरफ़ॉक्स इंस्टेंस चल रहा है, तो यह बदले में URL को एक नए टैब में खोलने और firefoxEmacs से निष्पादित निष्पादन योग्य को समाप्त करने का कारण बनेगा , लेकिन अन्यथा एक नया फ़ायरफ़ॉक्स उदाहरण Emacs के एक प्रक्रिया बच्चे के रूप में चल रहा होगा (परीक्षण प्रयोजनों के लिए) , यह बराबर है M-! sleep 1h & RET)।

यदि मैं तब एमाक्स से बाहर निकलना चाहता हूं, तो यह मुझसे पूछता है "सक्रिय प्रक्रियाएं मौजूद हैं; उन्हें मारें और वैसे भी बाहर निकलें?" विकल्प के साथ या तो फ़ायरफ़ॉक्स उदाहरण को मारने के लिए या, ठीक है, Emacs चल रहा है। इसके बजाय मैं firefoxEmacs पैरेंट से प्रक्रिया को "अलग" करना चाहूंगा ताकि फ़ायरफ़ॉक्स इंस्टेंस को चालू रखते हुए Emacs से बाहर निकल सकूं।

क्या Emacs से प्रक्रियाओं को स्पॉन करना संभव है कि Emacs से "बच", या Emacs के बाहर निकलने पर सभी स्पॉन प्रक्रियाओं को मरना चाहिए?


क्या आप किसी भी संयोग से विंडोज मशीन पर Emacs चला रहे हैं? यह एक ऐसे मुद्दे के समान है, जिसका मुझे लगभग 2 साल पहले से कोई जवाब नहीं मिला था - सबप्रोसेस को मारे बिना Emacs से एक प्रक्रिया को कैसे हटाया जाए : stackoverflow.com/q/19747637/2112489 OSX पर, उदाहरण के लिए, व्यवहार अलग है - यानी, मैं start-process(पीडीएफ दर्शक की तरह) एक बाहरी एप्लिकेशन खोल सकता हूं और Emacs को लगता है कि उसका काम खत्म हो गया है।
कानून

नहीं, मैं लिनक्स (फेडोरा 23) का उपयोग कर रहा हूं। मैं उस प्रश्न को प्रतिबिंबित करने के लिए संशोधन करूंगा।
टिम लैंडशीड

जवाबों:


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

ध्यान दें कि शर्त आवश्यक है, क्योंकि मैक में सेटिस्ड नहीं है।


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 &")और एक स्पष्ट नोट जोड़ सकते हैं कि मौजूदा प्रक्रिया से "कोचिंग" संभव नहीं है ताकि मैं उत्तर स्वीकार कर सकूं?
टिम लैंडस्केप

मुझे बताया गया था कि 'सेटसाइड' 'नोहप' से बेहतर था।
यंगफ्रॉग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.