Arka planda bir komut nasıl çalıştırılır ve çıktı alınmaz?


111

İki kabuk komut dosyası yazdım a.shve b.sh. In a.shve b.shbende sonsuz for döngüsü var ve terminale bir miktar çıktı yazdırıyorlar. Her iki çağıran bir komut dosyası yazmak isteyen a.shve b.shancak kullanım yerine komut sonsuz çalıştırmak olan bölgesinin hemen terminalin kontrolü yeniden istiyor ve terminal çıkış gizlemek istiyor.

Yanıtlar:


220

Kullanım nohupArka plan iş bitirmek için uzun zaman alırsa ya da Giriş sunucusuna gibi sadece SecureCRT veya bir şey kullanın.

Yönlendir stdout ve stderr için /dev/nullçıkışını görmezden.

nohup /path/to/your/script.sh > /dev/null 2>&1 &

Eklemek gerekirse, bazen betikler için bağımsız değişkenler olabilir, bu durumda yukarıdaki komut Belirsiz çıktı yönlendirmesi döndürür .
sabertooth1990

Bulduğum daha iyi bir yol, nohup /path/to/your/script.sh parameter1 > & 1 &eğer biri daha iyi bir yol biliyorsa kullanmaktır .
sabertooth1990

18
Tüm STDOUT ve STDERR akışlarını otomatik olarak nohup.out dosyasına eklediği /dev/null 2>&1için kullanıyorsanız ihtiyacınız yoktur nohup. Sadece kullanın:nohup /path/to/your/command &
Leonardo

1
@ sabertooth1990 Komut satırınız hatalı:-bash: syntax error near unexpected token '&'
notes-jj

1
O halde yaratılan süreci nasıl öldürürsünüz?
Alexis_A

33

Çıkışı şuna benzer bir dosyaya yönlendirin:

./a.sh > somefile 2>&1 &

Bu hem stdout hem de stderr'i aynı dosyaya yönlendirecektir. Stdout ve stderr'yi iki farklı dosyaya yeniden yönlendirmek istiyorsanız şunu kullanın:

./a.sh > stdoutfile 2> stderrfile &

/dev/nullStdout ve / veya stderr ile ilgilenmiyorsanız, dosyalardan birini veya her ikisini birden kullanabilirsiniz .

Yönlendirmelerle ilgili ayrıntılar için bash kılavuz sayfasına bakın .


23

Maalesef bu biraz gecikti, ancak herhangi bir standart veya hata çıktısı istemediğiniz somple komutlar için ideal çözümü buldum (gerekli olduğu yerde kredi: http://felixmilea.com/2014/12/running-bash-commands-background -properly / )

Bu, çıktıyı boş değere yönlendirir ve ekranı temiz tutar:

command &>/dev/null &

2
Not: Terminal kapatıldığında komut sona erecektir.
Banana

1
Gelecekte buna bakan ve bir oturum bittikten sonra komutların çalışmaya devam etmesini sağlayacak bir çözüm isteyen herkes için screen veya tmux'u öneririm. İlk oturumu kapattıktan sonra devam eden bir 'oturum içinde oturum' yürütmeleri önemlidir. Tekrar oturum açarsanız daha sonra devam eden oturuma yeniden bağlanabilirsiniz. Örneğin senkronizasyonun uzun süre çalışması gerektiği ve oturumunuzu çalışır durumda bırakmak istemediğiniz durumlarda rsync yedeklerini çalıştırmak için idealdir.
DanteAlighieri

13

Komut dosyanızla aynı dizindeyse, şunları içerir:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

&Sonunda arka planda çalışmasına Senaryonu kılan budur.

> /dev/null 2>&1Bölüm gerekli değildir - bu stdout'u yönlendirir ve size çıktı ve birçok gürültülü komut dosyaları için yapmak isteyebilirsiniz terminalde, onları görmek zorunda kalmamak için Stderr akışları.


7

Bildirimleri kaldırmak ve STDOUT ve STDERR'ı kapatmak için bir alt kabukta çalıştırın:

(&>/dev/null script.sh &)

Bu aynı zamanda arka plan iş günlükleri yazdırmak etmediğini sadece cevaptır [1] + 54765 done <emacs>teşekkür ederim
alper

2

Betiği bir linux kickstart'ta çalıştırmak istiyorsanız, aşağıdaki gibi çalıştırmanız gerekir.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &


0

Bu örnekler iyi çalışıyor:

nohup sh prog.sh proglog.log 2> & 1 &

Döngü için şu şekilde kullanabilirsiniz:

{1..10} içindeki i için; sh prog.sh yapmak; uyku 1; prog.log 2> & 1 &

Arka planda çalışır ve herhangi bir çıktı göstermez.

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.