Bir alt süreci “ayırmak” mümkün mü?


10

Kullandığım browse-url/ browse-url-firefoxözünde yürütür Linux altında Emacs 24.5.1 (Fedora 23) içinden Firefox'ta açık bağlantıları firefoxile URL ile yürütülebilir start-process. Halihazırda çalışan bir Firefox örneği varsa, bu da URL'nin yeni bir sekmede açılmasına ve firefoxEmacs'tan kaynaklanan yürütülebilir dosyayı sonlandırmasına neden olur , ancak aksi takdirde Emacs'ın işlem alt öğesi olarak yeni bir Firefox örneği çalışır (test amacıyla) , bu eşdeğerdir M-! sleep 1h & RET).

O zaman Emacs'tan çıkmak istiyorsam bana "Aktif süreçler var; onları öldür ve yine de çıkılsın mı?" Diye sorar. Firefox örneğini öldürme veya Emacs'ı çalışır durumda bırakma seçeneğiyle. Bunun yerine firefox, Firefox örneğini çalışır durumda tutarken Emacs'tan çıkabilmem için işlemi Emacs üst öğesinden "ayırmak" istiyorum .

Emacs'tan "hayatta" kalan süreçleri Emacs'tan çıkarmak mümkün mü, yoksa Emacs çıktığında tüm ortaya çıkan süreçler ölmeli mi?


Emacs'ı bir Windows makinesinde şans eseri çalıştırıyor musunuz? Yaklaşık 2 yıl önce hiç cevap alamadığım bir soruna benziyor - Alt süreci öldürmeden Emacs'tan bir süreç nasıl silinir : stackoverflow.com/q/19747637/2112489 OSX'te, davranış farklıdır - yani, start-processbir pdf görüntüleyici gibi harici bir uygulama açabilirim ve Emacs işinin bittiğini düşünüyor.
hukukçi

Hayır, Linux kullanıyorum (Fedora 23). Soruyu bunu yansıtacak şekilde değiştireceğim.
Tim Landscheidt

Yanıtlar:


4

İşte çözüm, @ abo-abo'nin cevabını kısaltmak.

(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'in set kimliği olmadığından koşulun gerekli olduğunu unutmayın.


1

İşte istediğinizi yapan bir komut:

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

Buradaki anahtar şey kullanmaktır nohup.

Buradaki kaynağa bakın .


Teşekkürler! nohupgüzel bir çözümdür. Maalesef cevabınızı sadece hedefe nasıl ulaşacağını arayan biri için "dikkat dağıtıcı" buluyorum. Lütfen kaynağı benzer (shell-command "nohup sleep 1h &")bir şeye kırpabilir ve cevabı kabul edebilmem için mevcut bir işlemden "ayırmanın" mümkün olmadığını gösteren açık bir not ekleyebilir misiniz?
Tim Landscheidt

Bana 'setid'in' nohup'dan daha iyi olduğu söylendi.
YoungFrog
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.