Neden “exec &” yerine “nohup &” kullanmalısınız?


67

nohupİkili olarak, herhangi bir kabuğundan ulaşılabileceğini biliyorum . Ancak execyerleşik muhtemelen her kabukta bulunur.

Birini diğerine tercih etmenin bir nedeni var mı?

Yanıtlar:


113

Hangisi daha iyi, balık mı yoksa bisiklet mi? nohupve execfarklı şeyler yapın.

execkabuğu başka bir programla değiştirir. Kullanımı exec: Basit bir arka plan işinde yararlı değildir exec myprogram; more stuffile kabuk değiştirir myprogramçalışmayacak şekilde ve more stufffarklı olarak myprogram; more stuffhangi ishal more stuffolduğunda myprogramsonlandırır; fakat arka planda exec myprogram & more stuffbaşlar myprogramve sonra more stuffolduğu gibi çalışır myprogram & more stuff.

nohupBelirtilen programı göz ardı edilen SIGHUP sinyaliyle çalıştırır. Bir terminal kapatıldığında, çekirdek bu terminaldeki kontrol işlemine (yani kabuk) SIGHUP gönderir. Kabuk, SIGHUP'ı arka planda çalışan tüm işlere gönderir. Bir işle çalışmak nohup, terminal ölürse (örneğin, uzaktan oturum açtıysanız ve bağlantı kesilirse veya terminal emülatörünüzü kapatırsanız olur), bu şekilde ölmesini önler.

nohupayrıca programın çıktısını dosyaya yönlendirir nohup.out. Bu, programın ölmesini önler, çünkü çıktısına veya hata çıktısına yazamaz. Not nohupgirişi yönlendirmez. Bir programı başlattığınız terminalden tamamen ayırmak için

nohup myprogram </dev/null >myprogram.log 2>&1 &

27
bisiklet> balık
Chris Jaynes

6
Naçizane size katılmıyorum. Balık, uygulanabildiği takdirde, açıkça üstün bir taşıma yöntemidir.
BU KULLANICI,

6
@ THISUSERNEEDSHELP Ama bisiklet kesinlikle daha iyi bir yemek mi?
Gilles

3
@GypsyCosmonaut Çalıştırdıktan sonra exec firefox, kabuk artık çalışmıyor: değiştirildi firefox. execBir programdan çıkmayı ve yeni bir program başlatmayı birleştirmeyi, ancak aynı süreç kimliğini korumayı düşünebilirsiniz . Terminal hiçbir şey durdurmak için söylediği için çalışmasını sağlar. Daha sonra Firefox'tan çıktığınızda firefoxişlem sonlandırılır. Terminal, çocuk sürecinin sona erdiğini ve bu nedenle sırayla çıktığını fark eder.
Gilles

5
Bir adama balık verin, onu bir günlüğüne besleyin. Bir erkeğe bisiklet verin, markete atabilir ve ömür boyu balık alabilir.
David

18

exec & => bir işlemi arka plan işlemi olarak yürütür, böylece aynı terminali diğer işler için kullanmaya devam edebilirsiniz.

nohup => tüm SIGHUP işlemlerini engeller (sinyali sonlandırır) ve terminal kapalı olsanız bile çalışmaya devam eder.

execa SIGHUPalındığında işlem ölür , ancak nohupişlem devam eder.


1
Bu cevap doğru görünüyor. Yukarıdaki diğer cevapların söylediği gibi normal execolarak çalışan sürecin yerini alır, ancak &exec'd komutunun arkaplanını kullandığınızda bu gerçekleşmedi . Ne bash ne de zsh.
Dan Pritts

@DanPritts Ne demek istemezsin? Bir arka plan alt işlemi başlar ve sonra değiştirilir, yani exec smth &olan bu (exec smth) &değil mi?
phk

1
Demek istediğim, normal olarak düşüneceğiniz şekilde (şu anki çalışan kabuğu değiştirerek) yürütülmez - sadece bir arka plan işlemi olarak çalıştırılır. Galiba muhtemelen aynı (exec smth) &. Ama aynı olmasını beklemiyordum - bir sözdizimi hatası olmasını beklerdim, bir işlemi nasıl yürütürsün (kendini değiştiriyorsun) ve daha sonra çalıştırılan sürecin arkaplanı? Artık yapmak için orada değilsin.
Dan Pritts

2

Yerleşik komut exec <command>, kabuğu değiştirir, <command>yeni bir işlem yoktur, yeni PID oluşturulmaz. <command>Normalde tamamlandıktan sonra terminaliniz kapanır. Arkaplanda çalıştırılarak ilk önce bir alt kabuk oluşturulur ve benzer şekilde hemen yerine geçer <command>.

nohup <command> Komut çalışır <command>ancak immume hangups (= S 1 öldürmek) kadar kabuk, bunun başlatıldığı terminali, kapalı olduğu zaman sona edilmez. İlk önce arka planda çalıştırarak bir alt kabuk oluşturulur ve komut arka planda çalışır ve sizi isteme döndürür.

Komut <command>dosyasında , hemen hemen aynı olsa da, hemen hemen aynı olur, komut dosyanız tarafından başlatılır ve komut dosyası <command>başlamak, çıktı göndermek veya tamamlamak için beklemeden devam eder .


Ben de ne yürütme hakkında emin değilim. Demek istediğim… Ne yapması gerektiğini anlıyorum ama yapmak script.sh &veya yapmak arasında sadece küçük bir fark görebiliyorum exec script.sh &. Her iki durumda da, komut bir çocuk işleminde yürütülür, arama işleminin yerine geçmez, bkz: paste.alacon.org/44474 (buraya bir yorumda kopyalamak çok uzun…). Neyi yanlış yapıyorum?
Stéphane

2

Karşılaştırmak olamaz nohupile exec. Bir yürütülebilir dosyayı çalıştırdığınızda nohup, oturum kapattığınızda işlem öldürülmez (ssh session); genellikle süreçleri daha düşük bir öncelikte çalıştırmak nohupiçin kullanılır nice. HUPSinyal, geleneksel olarak, bir şekilde bir uç oturum kapatma bağlı süreçleri uyarır olan

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.