Yanıtlar:
Hangisi daha iyi, balık mı yoksa bisiklet mi? nohup
ve exec
farklı şeyler yapın.
exec
kabuğu başka bir programla değiştirir. Kullanımı exec
: Basit bir arka plan işinde yararlı değildir exec myprogram; more stuff
ile kabuk değiştirir myprogram
çalışmayacak şekilde ve more stuff
farklı olarak myprogram; more stuff
hangi ishal more stuff
olduğunda myprogram
sonlandırır; fakat arka planda exec myprogram & more stuff
başlar myprogram
ve sonra more stuff
olduğu gibi çalışır myprogram & more stuff
.
nohup
Belirtilen 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.
nohup
ayrı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 nohup
girişi yönlendirmez. Bir programı başlattığınız terminalden tamamen ayırmak için
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec firefox
, kabuk artık çalışmıyor: değiştirildi firefox
. exec
Bir 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 firefox
işlem sonlandırılır. Terminal, çocuk sürecinin sona erdiğini ve bu nedenle sırayla çıktığını fark eder.
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.
exec
a SIGHUP
alındığında işlem ölür , ancak nohup
işlem devam eder.
exec
olarak ç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.
exec smth &
olan bu (exec smth) &
değil mi?
(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.
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 .
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?
Karşılaştırmak olamaz nohup
ile 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 nohup
için kullanılır nice
. HUP
Sinyal, geleneksel olarak, bir şekilde bir uç oturum kapatma bağlı süreçleri uyarır olan