Kabuk çıkarken ölmeyen bir işlemi nasıl çatallarım?


31

Emacs'ı kabuktan çalıştırırsam:

$ emacs foo &

ve sonra o kabuğu öldür, emacs ölür.

Bir komutu nasıl çalıştırabilirim, böylece kabuk öldüğünde ölmeyecek?

Nohup'a referans buldum, ancak bu yardım etmiyor gibi görünüyor:

$ nohup emacs foo &

Kabuk öldüğünde hala emakları öldürür.

Yanıtlar:


13

Bunun bir X uygulaması mı yoksa bir konsol uygulaması mı çalıştığını söylemiyorsunuz.

Bir konsol uygulaması olarak ise, elbette kapatmak gerekiyor. Girdi / çıktıdan kurtuldunuz, daha teknik olarak açık (sahte) tty. Demek istediğin bu pek olası değil, o yüzden bir X uygulaması hakkında konuştuğunu varsayalım.

nohupçalışmalı, neden olmadığından emin değil. Kabuk kapandığında, SIGHUPişlem grubundaki tüm işlemlere gönderir . nohup, komuta SIGHUP'ı yoksaymasını söyler.

Süreci süreç grubundan ayıran setsid'i de deneyebilirsiniz

alias emacs='setsid emacs'

Veya disownsonra ekle&


Ah, harika setler çalışıyor. Net olamadığım için üzgünüm. Evet, aslında kabukta çalışmayan X uygulamalarını kastediyorum. Temel olarak, kabuktan emacs (ya da başka bir işlem) başlatmak istiyorum, ancak kabuğa bağlı hiçbir şekilde istemiyorum. Sadece rahatlık için orada başladım.
— sligocki

41

En güvenilir yöntem gibi görünüyor:

(setsid emacs &)

Bu, ( &)arka plana çatal yapmak setsidve kontrol tty'sinden ayırmak için kullanılır.

Bunu bir kabuk fonksiyonuna koyabilirsiniz:

fork() { (setsid "$@" &); }

fork emacs

Olasılıklar:

  • disownYerleşik komutu:

    emacs &
    disown $!
    

    &komut ayırıcı olarak işlev görür disownve en son işe varsayılan olur, bu nedenle bu kısaltılabilir:

    emacs & disown
    
  • Çift- fork():

    (emacs &)
    

    Parantez içindeki komutlar ( )ayrı bir kabuk işleminde çalıştırılır.

  • setsid, Rich'in önerdiği gibi, en iyi seçenek olabilir, çünkü yeni bir oturum oluşturarak sürecin kontrol TTY'sini belirliyor :

    setsid emacs
    

    Bununla birlikte, aynı zamanda biraz da tahmin edilemez - sadece fork()bir süreç grubunun lideriyse ( örneğin setsidbir shsenaryoda kullanıldığında gerçekleşmeyecektir , örneğin; bu gibi durumlarda sadece Ctrl- C)


Harika! bunların hepsi benim için çalışıyor. Cephaneliğimde daha fazla alet olması güzel.
— sligocki

Hm ... (exec emacs)işe yarar mı?
— Merhaba71,

@ Merhaba: Sadece başka bir şey olmazdı (emacs). Alt kabuğa tek bir komut verildiyse exec, en azından durumunda belirtilir bash. Aynısı bash -c 'foo'versus için de geçerlidir bash -c 'exec foo'. (Bununla birlikte, not Emacs bu kendisini uç ayrılmakta olduğu;.., Örneğin, gvim, yapar Bu bilinen davranışı olan bir program ile daha iyi bir test etmek için olan)
— grawity

Çift çatal tekniğini öğrenmek için harika; Teşekkürler!
— Dave Abrahams,

Kendi sorunumu çözmek için trolling yaparken bunu buldum. (Setsid emacs &) benim için çalıştı. İyi yazılmış bir cevap için teşekkürler.
— Paulb

5

Kabuk ayarlarını kontrol et. Bunun yerine ekranı da deneyebilirsiniz nohup.


Ekran, oturumu kapatmadan önce bağlantısını kesmek için screen -rkullanırsanız Ctrl-A Ctrl-D, daha sonra işleme geri dönmenizi sağlar .
— 12'de Broam

Bu çok iyi bir nokta. Bunun tam tersine ihtiyacım vardı, yani bir deniz kabuğu istemek ve tamamlanmasını beklemeden diğer işlerle devam etmek, ancak screen -d -m sh -c "{do stuff } exit"çok daha mantıklı.
— Nemo
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.