Eğer zaten '&' kullanarak çatal kullanıyorsanız 'nohup' a ihtiyacınız var


26

Öncelikle bu soru birbiriyle ilgilidir ancak kesinlikle bu çok güzel soru ile aynı değil

Nohup, disown ve & arasındaki fark

Bir şeyi anlamak istiyorum: '&' yaptığımda, doğru mu soyacağım?

"Nohup ... &" yapmak hiç faydalı mıydı yoksa basit ve yeterli mi?

Birisi '&' kullanacağınız ve hala 'nohup' kullanmak isteyebileceğiniz bir durum gösterebilir mi?


1
Kabul edilen cevabı ve yorum dizisini okudunuz mu? Ne yaptığını açıklarlar nohup. Hangi kısmı karıştırdın?
Gilles 'SO- kötülük yapmayı bırak'

3
@Gilles: Sizin için açık olabilir , çünkü bu şeyleri bilirsiniz (temsilcisi görmüşsünüz) ... Ancak, bir başlangıç ​​için, bağlantıya girdiğim kabul edilen cevap kullanma hakkında bir kelime söylemiyor. hem nohup hem de '&' ... Sorumun diğerinden yeterince net ve farklı olduğundan eminim ve buradaki iki büyük cevap bunu kanıtlıyor gibi görünüyor; Ayrıca, gerçekten başka bir soruya bağlamak için acı çektiğimi mi ima ediyorsunuz, ancak kabul edilen cevabı okumadan!?
Cedric Martin

Yanıtlar:


32

Öncelikle, bir komutu her çalıştırışınızda, koştuğunuzda &veya çalıştırmasanız da, yeni bir işlem gerçekleştirirsiniz . &yalnızca arka planda çalıştırdığınız anlamına gelir.

Bunun çok doğru olmadığını unutmayın. Bazı komutlar, cdkabuk işlevidir ve genellikle yeni bir işlem yapmazlar. type cmdGenellikle cmdharici bir komut mu yoksa kabuk işlevi mi olduğunu söyleyecektir . type typeSize typekendisinin bir kabuk işlevi olduğunu söyler .

nohupfarklı bir şey. Yeni işlem görmezden gelmesini söyler SIGHUP. Ana kabuk kapatıldığında çekirdek tarafından gönderilen sinyaldir.

Sorunuzu cevaplamak için aşağıdakileri yapın:

  1. run emacs & (varsayılan olarak ayrı bir X penceresinde çalışmalıdır) .
  2. üst kabukta koşun exit.

emacsArka planda çalışmasına rağmen pencerenin öldüğünü fark edeceksiniz . Bu varsayılan davranıştır ve nohuptam olarak bunu değiştirmek için kullanılır.

Arka planda bir iş yürütmek ( &ya da bg, diğer kabukların da diğer sözdizimlerine sahip olmaları gerekir) modern sistemlerin yeteneklerinden çoklu görevlere kadar uzanan bir kabuk özelliğidir. Bunun yerine lansmanı istediğiniz her programda, çağdaş kabukları için yeni bir kabuk örneğini bölmek ait ( bash, zsh, ksh, ...) programların (veya bir listesini yönetmek yeteneğine sahip olacak işler ). Bir seferde sadece bir tanesi ön planda olabilir , bu da kabuk odağını alır. Birinin arka planda ön planda ve birinde çalışan bir süreç arasındaki farklar (ana bir acess olma konusunda daha fazla genişletmek isterdim stdin/ ' stdout).

Her durumda, bu, çocuk sürecinin tepki verme şeklini etkilemez SIGHUP. nohupyapar.


Büyük cevaplar için ikinize de +1 ... Ama hala kafam karıştı ... Soruma cevap vermeden önce bunu denedim: belki benim (çok eski) Debian Linux kurulumum doğru bir şekilde yapılandırılmadı ama eğer öyleyse "ve sonra" exit "yazın, yalnızca xterm çıkar: emacs orada kalır.
Cedric Martin

Emacs, SIGHUP'ı kendi başına kaldırabilecek kadar karmaşık. SIGHUP'taki çıkışlar yalnızca varsayılan olarakdır. Ntpd veya inetd gibi bir çok 'daemon' programı çıkma yerine SIGHUP'taki konfigürasyonlarını tekrar okuyacaktır. Ben kendim bir vim adamım, bu yüzden herhangi bir emacs ile fazla deneyimim yok.
Bruce Ediger

3
Emacs hakkında özel bir şey yok. Bir kabuk tipik olarak , kabuk normal çıktığında değil SIGHUP, kabuk kendisini aldığında alt işlemlerine gönderir SIGHUP. bash, çıkışta çocuklara huponexitgöndermesine neden olan bir seçeneğe sahiptir SIGHUP, ancak varsayılan olarak etkin değildir. gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson

Merhaba. her şeyden önce, harika bir açıklama. Tezinizi bir işlem yürüterek doğrulamaya çalıştım &ve kabuğumu çalıştırarak kapattım exit. İşlem hala devam ediyor. Neden öldürülmediğine dair bir fikrin var mı? Yoksa burada bir şey mi özlüyorum?
Ali Yılmaz, 8

Çalıştırdığınız işlem nedir?
rahmu

16

Bunu yapmak hiç yararlı oldu nohup ... &mu? Evet. Yalnızca "arka planda" olan bir işlemi başlatırsanız &, bu yeni işlemin hala orijinal kabuğun "işlem grubuna" üyeliği vardır. Bu kabuk veya işlem grubu belirli sinyaller alırsa (örneğin SIGHUP), varsayılan olarak çıkarlar. Bunun anlamı, &bir xterm veya rxvt veya başka bir pencereleme terminal emülatörü tarafından başlatılan bir kabuktan bir işlem gerçekleştirirseniz , pencereyi kapattığınızda, arka plan işleminin bir SIGHUP alması demektir. Rasgele yazılmış çoğu kod, SIGHUP'ı kullanmaz ve bu nedenle çıkar.

Bunu yaparsanız nohup ... &, nohupkomut SIGHUP'ı yoksayılacak şekilde ayarlar ve sonra komutu yürütür. Yeni çalıştırılan komut nohup, komut kendi kendine işlem yapmazsa, ayarlanan sinyal maskesini tutar . Eğer xterm veya rxvt'yi ya da her neyse onu kapatırsanız, çekirdek, görmezden gelinen komutun işlemine SIGHUP sunar. Koşmaya devam ediyor.

Bir yaparak nohupbir komuta size xterm kapatmak veya kapalı oturum açtıktan sonra çalışmaya devam sağlar.


Üzgünüm - sen beni kaybettin. Kullandığınız söylüyorsunuz &ile nohupsadece kullanarak nerede belirli durumlarda komut çalışan tutar nohupdeğil mi? Buradaki cevapla çelişiyor gibi görünüyor: unix.stackexchange.com/a/288064/1822
Mike B

2
@MikeB - "&", her zamanki çatal / set şeyler / exec sisteminin "arka planda" komutunu çağırmak için yaptığı çağrıları yapar. Yani, nohupped alır komut zaman uyumsuz çalışıyor. nohupÖnce bazı şeyler yapar exec()çatallı süreç belli işaretleri gözardı yapmak için sistem çağrısı. Bu yüzden, evet, bir "&" emri nohupolmayan bir kişinin yapamayacağı belirli şartlar altında bir komutun çalışmasına izin verecektir . Nohup yapan kabukla ilişkili xterm'i kapatmak veya oturumu kapatmak gibi.
Bruce Ediger

-1

Linux işletim sisteminde arka planda (son ekli olarak) bir program çalıştırıyorsanız ve devam ettikten sonra bile oturumu kapattıysanız: deneyin:

  ping google.com > ping_result  &

Oturum açtıktan sonra, çıktı dosyasında ping_resultartmaya devam edecek satır sayısını kontrol edin , hala çalışıyor demektir, ancak kapatılacağı söylenir. öyleyse nohupkomutun kullanımı nedir .

Sistem çıkışından sonra çalışmaya nohup emac &devam etmesi gereken, emacancak giriş yaptıktan sonra çalışmayı göstermediği için yukarıda belirtildiği gibi başka bir senaryo ==> .

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.