Yanıtlar:
nohup
Komut sadece yazar nohup.out
çıkış aksi terminale gider eğer. Komutun çıktısını başka bir yere (dahil) yönlendirdiyseniz, /dev/null
bunun yerine gidersiniz.
nohup command >/dev/null 2>&1 # doesn't create nohup.out
Kullanıyorsanız nohup
, bu muhtemelen &
her şeyin sonuna bir tane daha koyarak komutu arka planda çalıştırmak istediğiniz anlamına gelir :
nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
Linux'ta bir işi çalıştırmak nohup
girdisini de otomatik olarak kapatır. Diğer sistemlerde, özellikle BSD ve macOS, durum böyle değildir, bu nedenle arka planda çalışırken girişi manuel olarak kapatmak isteyebilirsiniz. Kapanış girişinin oluşturulması veya yaratılması üzerinde hiçbir etkisi yoktur nohup.out
, ancak başka bir sorunu önler: bir arka plan işlemi standart girdiden bir şey okumaya çalışırsa duraklar, ön plana geri getirmenizi ve bir şeyler yazmanızı bekler. Ekstra güvenli sürüm şöyle görünür:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
Ancak bunun komutun terminale doğrudan erişmesini engellemediğini veya kabuğunuzun işlem grubundan kaldırdığını unutmayın. İkincisini yapmak istiyorsanız ve bash, ksh veya zsh çalıştırıyorsanız, bunu bir disown
sonraki komut olarak argüman olmadan çalıştırabilirsiniz . Bu, arka plan işleminin artık bir kabuk "işi" ile ilişkili olmadığı ve kabuktan kendisine iletilen sinyalleri olmayacağı anlamına gelir. (Ayrımı not edin: disown
ed işlemi, üst kabuğu tarafından otomatik olarak kendisine sinyal iletmez - ancak nohup
, HUP
manuel kill
komut gibi başka yollarla gönderilen bir sinyal almaya devam eder.A nohup
'ed işlemi HUP
, tüm sinyalleri yok sayar , nasıl gönderilirse gönderilsin.)
Açıklama:
Unixy sistemlerinde, her girdi veya çıktı hedefi, kendisiyle ilişkilendirilmiş bir numaraya "dosya tanıtıcı" veya kısaca "fd" olarak adlandırılır. Çalışan her programın ("süreç") bunlardan oluşan bir grubu vardır ve yeni bir işlem başladığında bunlardan üçü zaten açıktır: fd 0 olan "standart girdi", sürecin okunması için açıkken, "standart çıktı" (fd 1) ve "standart hata" (fd 2) yazmak için açıktır. Sadece terminal penceresinde bir komut çalıştırırsanız, varsayılan olarak, yazdığınız her şey standart girişine giderken, hem standart çıktısı hem de standart hatası bu pencereye gönderilir.
Ancak, komutu başlatmadan önce kabuktan bu dosya tanımlayıcılarının herhangi birinin veya tamamının işaret etmesini isteyebilirsiniz; yönlendirme (ne olduğunu <
, <<
, >
, >>
) ve boru ( |
) operatörleri yapmak.
Boru bunlardan en basitidir ... command1 | command2
standart çıktısının command1
doğrudan standart girdisine beslenmesini sağlar command2
. Bu, UNIX araçlarında belirli bir tasarım modeline yol açan çok kullanışlı bir düzenlemedir (ve bir programın çıktısı boru hattındaki bir sonraki programa girmesine rağmen kullanıcıya bir mesaj göndermesine izin veren standart hatanın varlığını açıklar) . Ancak standart çıktıyı yalnızca standart girişe bağlayabilirsiniz; bir boruya hokkabazlık yapmadan başka dosya tanımlayıcıları gönderemezsiniz.
Yeniden yönlendirme işleçleri, hangi dosya tanımlayıcısının yeniden yönlendirileceğini belirtmenize izin vermesi açısından daha dostudur. Yani 0<infile
adlı dosyadan standart girdi okur infile
iken, 2>>logfile
adlı dosyanın sonuna standart hatasını ekler logfile
. Bir sayı belirtmezseniz, giriş yeniden yönlendirmesi varsayılan olarak fd 0 ( <
aynıdır 0<
) olurken, çıkış yeniden yönlendirmesi varsayılan olarak fd 1'dir ( >
aynıdır 1>
).
Ayrıca, dosya tanımlayıcıları bir araya getirebilirsiniz: 2>&1
"standart çıktı nereye giderse gidin standart hata gönder" anlamına gelir. Bu, artık standart ayrımı ve standart hatayı içeren ve artık onları ayırmanın hiçbir yolu olmadan karıştırılmış tek bir çıktı akışı elde ettiğiniz anlamına gelir, ancak aynı zamanda bir boruya standart hata ekleyebileceğiniz anlamına gelir.
Yani sıra >/dev/null 2>&1
, "standart çıktıyı /dev/null
şuraya gönder " (yazdığınız her şeyi atar özel bir cihazdır) "ve ardından standart çıktının gittiği yere standart hata gönder" (ki tam olarak emin olduğumuz /dev/null
) anlamına gelir. Temel olarak, "bu komut her iki dosya tanımlayıcısına yazdıklarını atın".
Ne nohup
standart hatanın ne de çıktının bir terminale bağlı olmadığını tespit ettiğinde, yaratma zahmetine girmez nohup.out
, ancak çıkışın kullanıcının gitmek istediği yere yönlendirildiğini varsayar.
/dev/null
Bu cihazda çok, girişi için çalışır; ile bir komut çalıştırırsanız </dev/null
, o komutun standart girdiden okuma girişimi anında dosya sonu ile karşılaşır. Birleştirme sözdiziminin burada aynı etkiye sahip olmayacağını unutmayın; yalnızca bir dosya tanımlayıcıyı aynı yönde açık olan başka bir dosyaya (giriş veya çıkış) yönlendirmek için çalışır. Kabuk bunu yapmanıza izin verir >/dev/null <&1
, ancak bu, bir çıkış akışında açık bir giriş dosyası tanımlayıcısıyla bir işlem oluşturmaya çalışır, bu nedenle sadece dosya sonuna vurmak yerine, herhangi bir okuma girişimi ölümcül bir "geçersiz dosya tanımlayıcısı" hatası tetikler.
nohup
"süreç daha sonra standart girdiden şey okumaya çalışırsa, bu ön plan ve tip bir şeye geri getirmek için bekleyen, duraklar." yanlış görünüyor. Bunun yerine, nohup
standart girişi kapatır (program ön planda çalıştırılsa bile herhangi bir girişi okuyamaz. Durdurulmaz, ancak bir hata kodu veya EOF alır).
nohup
geçerli değildir . Bunun nohup
bir kabuk yerleşimi değil, bir ikili yardımcı program olduğunu unutmayın.
nohup
Linux uygulamasının BSD veya OS X için farklı olduğunu mu kastediyorsunuz ?
awk
farklı, sed
farklı, nohup
farklı ...
nohup some_command > /dev/null 2>&1&
Tüm yapmanız gereken bu!
&
Kullanılmak üzere ihtiyaç duymaktan tutacak ctrl-c
size bu konularda eğer.
some_command
hata da dahil olmak üzere çıktı yakalama konusunda sıkıntı yaşamıyorsanız faydalıdır .
Üç G / Ç akışının tümünü yeniden yönlendirmeyi denediniz mi:
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
>
/ dev / null yerine </ dev / null?
< /dev/null
için standart girişi yeniden yönlendirir nohup
. Linux bunu gerektirmez, ancak POSIX, nohup
standart girişi terminale bağlıysa arka planda çalışamayacağı davranışlara izin verir . Bu sistemlere örnek olarak BSD ve OS X verilebilir.
Ayırma programını kullanmak isteyebilirsiniz . Bunu kullanıyorsunuz nohup
ama siz söylemedikçe bir çıktı günlüğü oluşturmuyor. İşte man sayfası:
NAME
detach - run a command after detaching from the terminal
SYNOPSIS
detach [options] [--] command [args]
Forks a new process, detaches is from the terminal, and executes com‐
mand with the specified arguments.
OPTIONS
detach recognizes a couple of options, which are discussed below. The
special option -- is used to signal that the rest of the arguments are
the command and args to be passed to it.
-e file
Connect file to the standard error of the command.
-f Run in the foreground (do not fork).
-i file
Connect file to the standard input of the command.
-o file
Connect file to the standard output of the command.
-p file
Write the pid of the detached process to file.
EXAMPLE
detach xterm
Start an xterm that will not be closed when the current shell exits.
AUTHOR
detach was written by Robbert Haarman. See http://inglorion.net/ for
contact information.
Not Programın yazarı ile hiçbir ilişkim yok. Ben sadece programın memnun kullanıcısıyım.
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null" &
Sudo çıkışının yeniden yönlendirilmesi sudo'nun parola için yeniden yanıt vermesine neden olur, bu nedenle bu varyantı yapmak için garip bir mekanizma gerekir.
Önünüzde mac / linux'unuzda bir BASH kabuğu varsa, yönlendirmeyi pratik olarak anlamak için aşağıdaki adımları deneyin:
Zz.sh adlı 2 satırlı bir komut dosyası oluşturun
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
Şu anda, komut dosyasının yürütülmesi ekrana hem STDOUT hem de STDERR gönderir.
./zz.sh
Şimdi standart yönlendirme ile başlayın:
zz.sh > zfile.txt
Yukarıda "echo" (STDOUT) zfile.txt dosyasına girer. Halbuki ekranda "hata" (STDERR) görüntülenir.
Yukarıdaki ile aynıdır:
zz.sh 1> zfile.txt
Şimdi tersini deneyebilir ve "hata" STDERR dosyasını dosyaya yönlendirebilirsiniz. STDOUT from "echo" komutu ekrana gider.
zz.sh 2> zfile.txt
Yukarıdaki ikisini birleştirerek şunları elde edersiniz:
zz.sh 1> zfile.txt 2>&1
Açıklama:
Sonunda, her şeyi nohup komutunun içine paketleyebilir ve arka planda çalıştırabilirsiniz:
nohup zz.sh 1> zfile.txt 2>&1&