Neden Linux kabuk komutunu '&' ile çalıştırın?


30

Red Hat Linux Enterprise sürüm 5 kullanıyorum. İnsanların bazen birkaç &seçenekle komut çalıştırdığını fark ettim . Örneğin, aşağıdaki komutta iki &işaret vardır. Bunların amacı nedir? Nohup ile her zaman birlikte kullanılırlar mı?

nohup foo.sh <script parameters> >& <log_file_name> &

Yanıtlar:


15

Martin's'in yanı sıra, Ash ve Kevin'ın cevaplarına ek olarak, bazen matematiksel olarak bitsel olarak kullanılan bir ve işareti görürsünüz * :

$ echo $(( 11 & 7 ))
3

Bit işleçlerine aşina değilseniz,:

11: 1011
 7: 0111
-------- AND
 3: 0011

Her pozisyonda ilk numarada bir bit VE ikinci numarada, bu biti cevapta bir olarak ayarlayın.

* Kevin'in cevabındaki özellik, mantıklı bir AND olarak adlandırılır .

Ash'in cevabını detaylandırmak için, yönlendirme sırasında kullanıldığında ve işareti kabuğa bir dosya tanıtıcısını kopyalamasını söyleyebilir. Bu komutta echo "hello" > outputfile 2>&1ampersand, standart hataya (stderr, dosya tanımlayıcısı 2) gidebilecek herhangi bir çıkışın standart çıktıyla aynı yere gitmesine neden olur (stdout, dosya tanımlayıcısı 1, sol taraf için varsayılan >). >& outputfileOperatör için steno edilir > outputfile 2>&1.

Ayrıca, Bash 4'te yeni, cümlelerden için iki yeni sonlandırıcılar vardır casekomuta ;&ve ;;&eğer öyleyse bir olgu sonraki test yapılıp yapılmadığını, "içinden düşer" ve etkileyebilecek olan.


Harika Dennis! Bir makineye ssh terminal günlüğü kullandığımı ve ardından komutu yürütmek için ssh terminalini kullandığımı (uzun süreli bir işlemi varsayalım), sonra terminal oturumundan çıkarsam, komutun uzun süreli işleminin doğru sonlandırılacağını varsayalım. Ve komutun kabuktan çıksam bile çalışmaya devam etmesini istiyorsam, nohup kullanmalı mıyım, veya & (komutun sonunda) mı yoksa hem nohup hem de?
George2

1
@ George2: Hayır, >& filenamehem stdout'u hem de stderr'yi aynı dosyaya verir. Yalnızca stderr'i yeniden yönlendirmek istiyorsanız (ve stdout'u yalnız bırakın) yaparsınız 2> filename. Diğer sorunuza gelince, büyük olasılıkla her ikisini de kullanmak istiyorum nohupve &.
sonraki duyuruya kadar duraklatıldı.

1
@ George2: Komutu arka plandan çıkarmazsanız, bir kabuk istemi alamazsınız, böylece bir komut logoutveya exitkomut yayınlayabilirsiniz .
sonraki duyuruya kadar duraklatıldı.

2
George: Eğer kullanmazsan, o zaman asla başka bir şey yapma isteğini geri alamazsın. İşlem (ne olursa olsun) bitinceye veya sonlandırılana / sonlandırılana kadar terminal “kapatılacaktır”. & İşlemin arka planda çalışacağını garanti eder. Ancak, oturumu kapatırsanız, işletim sistemi arka plan işlemlerinizi de öldüren tüm işlemlerinizi sonlandırır. Eğer nohup kullanıyorsanız , “sizi sonlandıracak komutu yoksay” işlemine geçiyorsunuz .
Martin Marconcini

1
@ George2: Evet. "kilitlenmelere karşı bağışıklık" == "işlem devam" ve "tty olmayan" == "terminal konsolu oturumundan çık" "
sonraki bildirime kadar duraklatıldı.

32

Bash kabuk betiğinde, “&” işareti ve işlemleri çatallamak için kullanılır:

find -name hello &

Find komutunun arka planda çatallanmasına ve çalıştırılmasına neden olur (her zaman PID'sini kullanarak öldürebilirsiniz).


Teşekkürler Martin, ssh terminal günlüğünü bir makinede kullandığımı ve ardından komutu yürütmek için ssh terminalini kullandığımı varsayalım (uzun süreli bir işlem varsayalım), sonra terminal oturumundan çıkarsam, komutun uzun süreli işlemi doğru sonlandırılacak ? Komutu & ssh terminalini kullanarak uygularsam, terminalden çıksam bile, komutun uzun süreli çalışması hala devam ediyor, değil mi?
George2

1
Bu doğru George. Arka plan işlemleri, çıkana veya siz onları öldürene kadar devam etmelidir. Ancak, daha önce de belirtildiği gibi, kullanıcı oturumu kapattığında işlemin ölmesini önlemek için hiçbir şeye ihtiyacınız olmayacak.
Martin Marconcini

Teşekkürler Martin! Neden hem & hem de nohup kullanmamız gerektiğini ve terminal konsolu çıksa bile komutun çalışmaya devam etmesine izin verme hedefine ulaşmamızı sağlayan bireysel fonksiyonlarının neler olduğunu bilmek istiyorum. Nohup için man sayfasını okudum ve "asılanlara karşı bağışıklık için bir komut çalıştır," tty olmayan bir çıktıyla "deniyor," asılanlara karşı bağışıklığın, komutun istifadan etkilenmeden çalışmasına devam etmesine izin vermenin ne demek olduğunu "kafam karıştı terminal konsolu? Öyleyse, nohup kullanmanın yeterli olduğunu ve kullanmaya gerek olmadığını düşünüyorum. Herhangi bir yorum?
George2

1
Her ikisini de kullanmanız gerekir, eğer & kullanmazsanız, terminal diğer komutları girmenize izin vermez. Görmenin en iyi yolu, sadece denemektir. İyi bir örnek, find gibi bir süre alan bir komuttur: find -name SomeName /> somefile.txt, nohup ile bunu deneyin ve & ve farkları görün.
Martin Marconcini

Bu nohup sorusu için harika bir cevabı var: serverfault.com/questions/311593/…
joshperry

26

Neden Linux kabuk komutunu '&' ile çalıştırın?

Hemen komut istemini geri almak ve işlemi arka planda çalıştırmak için.

Bunların işlevi nedir?

nohup , arka plan işleminin, kullanıcı oturumu kapattıktan sonra (veya başlangıç ​​kabuğundan çıktıktan sonra) çalışmaya devam etmesini sağlar.

> & standart çıktıyı ve standart hatayı günlük dosyasına yönlendirir.

Her şeyi arka planda çalıştırır ve hemen geri istemenizi sağlar.

Açıklama:

Her Linux işlemi, üç giriş / çıkış kanalı, "stdin" girişi, standart çıkış "stdout" ve standart hata çıkışı "stderr" açar. İkili dosya için kullanılabilirler, ancak geleneksel olarak metinlerdir. Çoğu program stdin'in kapandığını gördüğünde, programdan çıkarlar (programlayıcı tarafından değiştirilebilir).

Ebeveyn kabuğu çıkınca çocuklara stdin kapanır ve (genellikle, genellikle) çocuklar da çıkar. Buna ek olarak, çocuklara bir yazılım sinyali (SIGHUP), kullanıcının "telefonu kapattığını" (eski adıyla modem) belirttiğini ve burada varsayılanın da çıkacağını belirten bir sinyal alır. (Bir programcının programı yazarken bunların hepsini değiştirebileceğini unutmayın).

Yani, hiçbir şey yapmayan şey, çocuğa ayrı bir I / O ortamı vermek, girişleri ve çıkışları ana kabuğa bağlı olmayan bir şeye bağlamak ve çocuğu SIGHUP sinyalinden korumaktır. Kullanıcı bağlantısını kestikten sonra, kullanıcının kabuğuna değil, init (işlem 1) 'e ait olan nohup arka plan işlemini göreceksiniz.

Ancak nohup, işlem ön planda yürütülürse işi tam olarak yapamaz, bu nedenle &programı arka planda çalıştırmak için kullanılır, burada oturum açmış bir kullanıcıyla veya kullanıcı olmadan mutlu bir şekilde çalışmaya devam eder.


Bir makineye ssh terminal günlüğü kullandığımı ve ardından komutu yürütmek için ssh terminalini kullandığımı (uzun süreli bir işlemi varsayalım), sonra terminal oturumundan çıkarsam, komutun uzun süreli işleminin doğru sonlandırılacağını varsayalım. Ve komutun kabuktan çıksam bile çalışmaya devam etmesini istiyorsam, nohup kullanmalı mıyım, veya & (komutun sonunda) mı yoksa hem nohup mı?
George2

1
Düzeltin, SSH bağlantısı kesildikten sonra işlemin devam etmesi için hem nohup hem de & kullanın.
kmarsh

Teşekkürler Kmarsh! Neden hem & hem de nohup kullanmamız gerektiğini ve terminal konsolu çıksa bile komutun çalışmaya devam etmesine izin verme hedefine ulaşmamızı sağlayan bireysel fonksiyonlarının neler olduğunu bilmek istiyorum. Nohup için man sayfasını okudum ve "asılanlara karşı bağışıklık için bir komut çalıştır," tty olmayan bir çıktıyla "deniyor," asılanlara karşı bağışıklığın, komutun istifadan etkilenmeden çalışmasına devam etmesine izin vermenin ne demek olduğunu "kafam karıştı terminal konsolu? Öyleyse, nohup kullanmanın yeterli olduğunu ve kullanmaya gerek olmadığını düşünüyorum. Herhangi bir yorum?
George2

1
Cevaplarımı cevaplamak için düzenleyeceğim.
kmarsh

13

Ek olarak Martin'in cevabı @: işareti diğer kullanım ( >&yukarıdaki gibi) hem çekebilmektir stdoutve stderr. Normalde, çıktıyı yalnızca '>' olan bir dosyaya yönlendirirseniz stdout, herhangi bir hatayı kaçırmanız için çıktıyı yalnızca alırsınız .


1. Teşekkürler Ash, "> & <günlük dosyası adı>" nın tüm stderr ve stdout'ları günlük dosyasına attığını, doğru mu? 2. "> <log file name>" kullanarak, tüm stdout'ları günlük dosyasına aktaracak, doğru mu?
George2

1
@ George: Evet, doğru.
Ash,

Teşekkürler Ash! Neden hem & hem de nohup kullanmamız gerektiğini ve terminal konsolu çıksa bile komutun çalışmaya devam etmesine izin verme hedefine ulaşmamızı sağlayan bireysel fonksiyonlarının neler olduğunu bilmek istiyorum. Nohup için man sayfasını okudum ve "asılanlara karşı bağışıklık için bir komut çalıştır," tty olmayan bir çıktıyla "deniyor," asılanlara karşı bağışıklığın, komutun istifadan etkilenmeden çalışmasına devam etmesine izin vermenin ne demek olduğunu "kafam karıştı terminal konsolu? Öyleyse, nohup kullanmanın yeterli olduğunu ve kullanmaya gerek olmadığını düşünüyorum. Herhangi bir yorum?
George2,

4

Martin ve Ash'in cevabına ek olarak, bazen bir &&token kullanımını görebilirsiniz . Bu, "eğer sadece ilk komut başarılı bir şekilde çalıştıysa ikinci komutu çalıştır" demek için kullanılır. İyi yazılmış bir komut, herhangi bir hata varsa, başarıyla çıkmaz.

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$

Harika Kevin! Bir makineye ssh terminal günlüğü kullandığımı ve ardından komutu yürütmek için ssh terminalini kullandığımı (uzun süreli bir işlemi varsayalım), sonra terminal oturumundan çıkarsam, komutun uzun süreli işleminin doğru sonlandırılacağını varsayalım. Ve komutun kabuktan çıksam bile çalışmaya devam etmesini istiyorsam, nohup kullanmalı mıyım, veya & (komutun sonunda) mı yoksa hem nohup mı?
George2

Her ikisi de işe yarar. NOHUP bunu yapmanın orijinal yoluydu, hayal ediyorum (ama tamamen tahmin ediyorum), ancak arka plan şimdi çalışıyor. Önemli bir fark, bir uzak sisteme sshing yaparak etkileşimli bir kabuk çalıştırırken olmasıdır. NOHUP işlemi ön planda çalışır, ancak çıkış yaparsanız çalışmaya devam eder, oysa arka plan işlemi komutu doğurduktan hemen sonra geri döner. Ancak arka planda çalışan bir komutla etkileşimli bir kabuktan çıkmaya çalıştığınızda, önce uyarılırsınız.
Kevin M,

2

Martin'in cevabı iyi, ama biraz belirsiz. Komut her zaman çatallanır ve çalıştırılır, ancak normal kabuk davranışı komutun çıkmasını beklemek içindir. Ve işareti arka planın içine koyar, böylece terminalinizi geri alırsınız ve başka şeyler yapabilirsiniz. İşlem stdout'a veya stderr'e veri gönderirse, bu, istemde ne yaptığınızla karıştırılır ve sizi şaşırtabilir. Bu yüzden> & /path/to/logfile.txt ile yönlendiriyorsunuz.

George2'ye cevaben, bir kabuğun çıkması için normal davranış, SIGHUP sinyalini aynı işlem grubundaki tüm işlemlere (esas olarak ürettiğiniz şeyler) göndermek ve genellikle sona ereceklerdir. Bunun, kabuk işlemini kapatsanız bile devam etmesini istiyorsanız, nohup komutunu, bu sinyali yok saymak ve çalışmaya devam etmelerini sağlamak için kullanabilirsiniz. Bu tür bir işlem için özel bir isim var, buna daemon süreci adı verilir ('iblis' olarak telaffuz edilir).


Teşekkürler Rich! Bir makineye ssh terminal günlüğü kullandığımı ve ardından komutu yürütmek için ssh terminalini kullandığımı (uzun süreli bir işlemi varsayalım), sonra terminal oturumundan çıkarsam, komutun uzun süreli işleminin doğru sonlandırılacağını varsayalım. Ve komutun kabuktan çıksam bile çalışmaya devam etmesini istiyorsam, nohup kullanmalı mıyım, veya & (komutun sonunda) mı yoksa hem nohup mı? Ve neden?
George2

Hey George, üzgünüm çok geç cevap veriyorum. Evet, kabuğundan çıkarsanız, uzun süreli işlem sona erecektir. Devam etmesini istiyorsanız, hem nohup (kabuk kapandığında sonlandırılmaması için) hem de & (arka plan koymak için, böylece Crtl-D veya kabuğunuzdan çıkabilirsiniz) yapmanız gerekir. Ayrıca, SIGHUP'ı biraz farklı bir şekilde görmezden gelmesini sağlayarak, işleminizin çalışmasını sağlayacak setsid komutuna da bakabilirsiniz.
Rich Homolka 15

Harika cevap, arka planda çalışan kabuk-başlatılmış işlemler için en iyi uygulamaları açıklar.
Marcel Valdez Orozco
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.