Arka plan işlemlerinin çıktısını neden görebilirim?


31

Örneğin, yazarken ping 8.8.8.8 &neden ping işleminin çalıştığını görebiliriz? Ve yazarken find / -name '*test*' &, monitörde de görülüyor.

Neden? Gerçekten arka planda değil mi?

Yanıtlar:


43

&Uyumsuz, bir iş olarak arka planda komutu çalıştırmak için kabuk, yani o çatallı ve ayrı alt kabukta çalıştırılır, yönlendirir.

Eğer koyduğunuzda o Not &hem - çıkış stdout ve stderr - hala edilecek ekrana basılan . Ekranda herhangi bir çıktı görmek istemiyorsanız, hem yönlendirme stdoutve stderrbir dosyaya:

myscript > ~/myscript.log 2>&1 &

Genellikle, hataları daha sonra analiz etmekten endişe duymuyorsanız stderr, yeniden yönlendirerek silmek isteyebilirsiniz /dev/null.

Komutları / komut dosyalarını aynı anda ayrı alt kabuklarda da çalıştırabilirsiniz. Örneğin;

./script1 & ./script2 & ./script3 & 

Bir arka plan işi komutla bitmeden önce komut satırına geri getirilebilir:

fg <job-number>

job-numberÇalıştırarak elde edilebilir

jobs

İyi cevap. Birini /dev/nullçıkışı bir yere kaydetmek yerine atmak istiyorsa, terminal çıkışını yönlendirmek için bir dosya olarak da kullanabilirsiniz . Ve I doğru olduğunu duyuyorum 2>&1yönlendirmeleri stderriçin stdout? Belki bunu da açıklığa kavuşturmak istersiniz ... Teşekkürler.
Byte Commander

@ByteCommander Teşekkürler :) düzenlenmiş, şimdi net olduğunu umuyorum. Evet, doğru olan 2>&1yönlendirmeleri stderriçin stdout.
Ron,

3
stty tostopTerminale yazmaya çalıştıklarında arkaplan işlerinin askıya alınmasına neden olacağını söylemeye değeceğini düşünüyorum .
kasperd

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

Bunu yapmanın tek dezavantajı, çıktıların stdout ve stderr'e sırasının sırasının günlük dosyasında karışmasıdır.
matthieu

8

Kullandığınızda &, işlem arka planda çalışıyor. Ancak standart çıkışı hala terminal.

Aslında, çalıştırabilir ping 8.8.8.8 &ve find / -name '*test*' &aynı zamanda (karma bir çıktı ile sonuçlanan), ancak çalışmayabilir ping 8.8.8.8ve find / -name '*test*'aynı kabuk üzerinde aynı anda.

Bir şey görmek istemiyorsanız, bunun gibi bir şey kullanın ping 8.8.8.8 &> /dev/null &.


Ek olarak, nohupve hakkında bilgi edinmek isteyebilirsiniz disown.


disownçıktının terminale yazdırılmasını engellemez.
Ruslan,

@Ruslan: hayır, ancak işi kabuktan siler. OP'nin ilgisini çekebilecek bir şey olabilir (ya da olmayabilir).
Andrea Corbellini
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.