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.