Nohup ve ampersand arasındaki fark nedir


243

Her ikisi de nohup myprocess.out &veya myprocess.out &myprocess.out'u arka planda çalışacak şekilde ayarlayın. Terminali kapattıktan sonra işlem devam ediyor. Aralarındaki fark nedir?


hangi kabuğu kullanıyorsun davranış mermilere göre değişir
shx2

1
bash. Ve neden @nemo'nun cevabına göre biliyorum.
Yarkee

@ Yanıt sorununuza uyuyorsa, lütfen soruyu kabul edilmiş olarak işaretleyin (yanıtlayanların oylarının altındaki onay kutusu), bu nedenle yanıtlanmamış olarak sarkmıyor. Tüm sorularınız için bunu yapmalısınız :)
nemo

1
shutdownbelirli bir Linux anlamı olan bir terim olarak kullanılmamalıdır exit.
Patrizio Bertoni

Yanıtlar:


317

nohup"ve" işareti (bkz. man 7 signal) ve işareti değil (kabuk bu şekilde tutturulmuş veya hiç gönderilmez hariç SIGHUP).

Normalde, &daha sonra kabuğu kullanarak ve sonra kabuktan çıkarken bir komut çalıştırılırken kabuk, alt komutu ( kill -SIGHUP <pid>) ile alt komutu sonlandıracaktır . Bu nohup, sinyali yakalayıp asla gerçek uygulamaya ulaşmayacak şekilde yok sayarken, kullanımı önlenebilir .

Bash kullanıyorsanız, shopt | grep huponkabuğunuzun alt işlemlerine SIGHUP gönderip göndermediğini öğrenmek için komutu kullanabilirsiniz . Eğer kapalıysa, sizin için olduğu gibi işlemler sonlandırılmaz. Bash'ın uygulamaları nasıl sonlandırdığı hakkında daha fazla bilgiyi burada bulabilirsiniz .

Durumlar vardır nohupsüreç sizi yeniden bağlar başlattığınızda, örneğin çalışmıyor SIGHUPo olduğu gibi, sinyal burada .


Sadece &alt komutun bazı sinyaller almamasına neden olduğunu belirtmek gerekebilir (örn. SIGINT). nohupesasen SIGHUPyayılmayan sinyaller listesine eklenir .
studgeek

46

myprocess.out &bir alt kabuk kullanarak işlemi arka planda çalıştırır. Geçerli kabuk sonlandırılırsa (oturumu kapat ile), tüm alt kabuklar da sonlandırılır, böylece arka plan işlemi de sonlandırılır. Nohup komut göz ardı HUPsinyali ve akım kabuk sonlandırılır böylece bile altkabuk ve myprocess.outarka planda çalışmaya devam edecektir. Başka bir fark, &tek başına stdout / stderr'i yönlendirmemesidir, bu nedenle herhangi bir çıktı veya hata varsa, bunlar terminalde görüntülenir. nohup ise stdout / stderr öğesini nohup.outveya konumuna yönlendirir $HOME/nohup.out.


6
Ben koşuyorum myprocess.out &ve kabuğundan çıkıyorum. Ancak, ps aux | grep myprocess.outbaşka bir kabuk kullandığımda, yine de "myprocess.out" bulabilirsiniz. Bu, işlemin devam etmekte olduğu, sonlandırılmayacağı anlamına gelir.
Yarkee

1
@amit_g Ana kabuğu öldürürken kill -9bir SIGHUP olmayacaktır çünkü bu , üst kabuğun yapamayacağı SIGKILL'i işlemesini gerektirir.
nemo

2
Çekimi kontrol et | Diğer cevapta belirtildiği gibi grep hupon.
amit_g

31

Çoğu zaman uzak sunucuya ssh kullanarak giriş yaparız. Bir kabuk komut dosyası başlatırsanız ve oturumu kapatırsanız işlem sonlandırılır. Nohup, kabuktan çıktıktan sonra bile komut dosyasını arka planda çalıştırmaya devam etmeye yardımcı olur.

Nohup command name &
eg: nohup sh script.sh &

Nohup, HUP sinyallerini yakalar. Nohup işi otomatik olarak arka plana koymaz. Bunu açıkça &


Teşekkürler. Cevabınızı beklemiyordum ama bunun burada olması harika. Sormadığım soruya cevap veriyor: D
Vaibhav Kaushal

26

Ve işareti (&) kullanıldığında, komut bir alt işlemde (geçerli bash oturumuna alt öğe) çalıştırılır. Ancak oturumdan çıktığınızda tüm alt süreçler öldürülür.

nohup + ve işareti (&) kullanmak aynı şeyi yapar, ancak oturum sona erdiğinde, alt işlemin üst öğesi "1" olarak değiştirilir, bu da çocuğu öldürülmekten korur.


7

Yanlışsam düzelt

  nohup myprocess.out &

nohup, kapatma sinyalini yakalar, yani terminal kapandığında bir işlem gönderir.

 myprocess.out &

İşlem çalışabilir ancak terminal kapatıldıktan sonra durur.

nohup myprocess.out

İşlem terminali bile çalıştırabilir, ancak terminalde ctrl+ tuşuna basarak işlemi durdurabilirsiniz z. Crt+ zvarsa çalışmaz &.


2

Nohup komutu bir sinyal maskeleme yardımcı programıdır ve kapatma sinyalini yakalar. Ve işareti gibi kapatma sinyallerini yakalamaz. Kabuk, & komutunu kullanarak ve kabuktan çıkarken bir komut çalıştırırken kapatma komutuyla alt komutu sonlandıracaktır. Bu, sinyali yakaladığı için nohup kullanılarak önlenebilir. Nohup komutu, çekirdek tarafından bir sürece gönderilebilen ve onları engelleyebilen kapatma sinyalini kabul eder. Nohup komutu, kullanıcı uzun süredir çalışan uygulama oturumunu başlatmak veya işlemin başlatıldığı pencereyi kapatmak istediğinde yardımcı olur. Bu eylemlerden herhangi biri normal olarak çekirdeğin uygulamada askıda kalmasını ister, ancak bir nohup sarıcısı işlemin devam etmesine izin verir. Ve işareti kullanıldığında komut bir alt işlemde ve geçerli bash oturumunun bu alt öğesinde çalıştırılır. Oturumdan çıktığınızda, bu sürecin tüm alt süreçleri öldürülecektir. Ve işareti aktif kabuk için iş kontrolü ile ilgilidir. Bu, arka planda bir oturumda bir işlem çalıştırmak için kullanışlıdır.


0

Ortamlar arasındaki küçük farklılıkların sizi ısıtabileceği birçok durum vardır. Bu, son zamanlarda koştuğum bir şey. Bu iki komut arasındaki fark nedir?

1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &

Cevap her zamankiyle aynı - duruma bağlı.

nohup, ve işareti yapmazken kapatma sinyalini yakalar.

Telefonu kapatma sinyali nedir?

SIGHUP - kontrol terminalinde askıda kalma tespit edildi veya kontrol sürecinin ölümü (değer: 1).

Normalde, & komutunu kullanarak ve daha sonra kabuktan çıkarken bir komut çalıştırırken, kabuk, alt-komutu kapatma sinyaliyle sonlandırır (kill -SIGHUP $ PID gibi). Bu, nohup kullanarak önlenebilir, çünkü sinyali yakalar ve asla gerçek uygulamaya erişmeyecek şekilde yok sayar.

Güzel, ama bu durumda olduğu gibi her zaman 'buts' vardır. Kabuk SIGHUP göndermeyecek şekilde yapılandırıldığında bu başlatma yöntemleri arasında bir fark yoktur.

Bash kullanıyorsanız, kabuğunuzun alt işlemlerine SIGHUP gönderip göndermediğini öğrenmek için aşağıdaki komutu kullanabilirsiniz:

~ $ shopt | grep hupon

Ve dahası - nohup'un çalışmadığı durumlar var. Örneğin, başlattığınız işlem NOHUP sinyalini yeniden bağladığında (uygulama kodu düzeyinde yapılır).

Açıklanan durumda, bir özel hizmet başlatma komut dosyası içinde fark eksikliği eksikliği nohup komutu olmadan uygun uygulamayı ayarlayan ve başlatan ikinci bir komut dosyasına çağrı oldu.

Bir Linux ortamında her şey sorunsuz çalıştı, ikincisinde ikinci komut dosyası çıkar çıkmaz uygulamadan çıkıldı (bu vakayı tespit etmek, elbette düşünebileceğinizden çok daha fazla zaman aldı: stuck_out_tongue :).

Nohup'u ikinci komut dosyasına başlatma yöntemi olarak ekledikten sonra, komut dosyaları çıksa ve bu davranış her iki ortamda da tutarlı olsa bile uygulama çalışmaya devam eder.

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.