Nohup.out dosyasını almadan nohup komutunu nasıl kullanırım?


309

Nohup komutuyla ilgili bir sorunum var.

İşimi yürüttüğümde çok fazla veri var. Nohup.out çıktısı çok büyür ve işlemim yavaşlar. Nohup.out almadan bu komutu nasıl çalıştırabilirim?


Yanıtlar:


612

nohupKomut sadece yazar nohup.outçıkış aksi terminale gider eğer. Komutun çıktısını başka bir yere (dahil) yönlendirdiyseniz, /dev/nullbunun 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 nohupgirdisini 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 disownsonraki 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: disowned işlemi, üst kabuğu tarafından otomatik olarak kendisine sinyal iletmez - ancak nohup, HUPmanuel killkomut 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 | command2standart çıktısının command1doğ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<infileadlı dosyadan standart girdi okur infileiken, 2>>logfileadlı 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 nohupstandart 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/nullBu 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.


1
İlişkin 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).
Tim

1
@Tim - bu cevap Linux için doğrudur, ancak standart girişi otomatik olarak kapatmayan BSD veya OS X için nohupgeçerli değildir . Bunun nohupbir kabuk yerleşimi değil, bir ikili yardımcı program olduğunu unutmayın.
Mark Reed

nohup, coreutils'in bir parçasıdır. nohupLinux uygulamasının BSD veya OS X için farklı olduğunu mu kastediyorsunuz ?
Tim

Evet. "Coreutils" adı bir GNU paketine atıfta bulunur. Ancak BSD, OS X, SmartOS / Illumos ve birçok ticari Unix (temelde GNU'dan daha uzun süredir bulunanlar) GNU olmayan çekirdek yardımcı programlara sahiptir. awkfarklı, sedfarklı, nohupfarklı ...
Mark Reed

Neden "ekstra güvenli" yazdınız </dev/null? Ayrıca bkz. 0>/dev/null Unix.stackexchange.com/a/266247
Tim

68
nohup some_command > /dev/null 2>&1&

Tüm yapmanız gereken bu!


4
Hemen hemen aynı şey vardı başka bir cevap vardı, ama sonunda ekstra "&" yoktu.
11101101b

10
&Kullanılmak üzere ihtiyaç duymaktan tutacak ctrl-csize bu konularda eğer.
SunSparc

1
BG'de

Bu, yalnızca some_commandhata da dahil olmak üzere çıktı yakalama konusunda sıkıntı yaşamıyorsanız faydalıdır .
wulfgarpro

12

Üç G / Ç akışının tümünü yeniden yönlendirmeyi denediniz mi:

nohup ./yourprogram > foo.out 2> foo.err < /dev/null &

1
Olması gerekmiyor >/ dev / null yerine </ dev / null?
Scott Chu

3
@ScottChu < /dev/nulliçin standart girişi yeniden yönlendirir nohup. Linux bunu gerektirmez, ancak POSIX, nohupstandart girişi terminale bağlıysa arka planda çalışamayacağı davranışlara izin verir . Bu sistemlere örnek olarak BSD ve OS X verilebilir.
Mikko Rantalainen

8

Ayırma programını kullanmak isteyebilirsiniz . Bunu kullanıyorsunuz nohupama 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.


2
Bağlantı kopuk değil ve git repo eski. Mevcut v0.2.3'ü içermez.
Dan

5

Aşağıdaki komut nohup.out almadan arka planda bir şey çalıştırmanıza izin verir:

nohup command |tee &

Bu şekilde, uzak sunucuda komut dosyası çalıştırırken konsol çıktısı alabileceksiniz: resim açıklamasını buraya girin


4
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.


1

Ö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
  • Echo komutunun çıktısı STDOUT dosya akışına gider (dosya tanıtıcı 1).
  • Hata komutunun çıktısı STDERR dosya akışına gider (dosya tanıtıcı 2)

Ş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:

  • BİRİNCİ, STDOUT 1'i zfile.txt dosyasına gönder
  • Sonra STDERR 2'yi STDOUT 1'e gönderin (& 1 işaretçisi kullanarak).
  • Bu nedenle, hem 1 hem de 2 aynı dosyaya gider (zfile.txt)

Sonunda, her şeyi nohup komutunun içine paketleyebilir ve arka planda çalıştırabilirsiniz:

nohup zz.sh 1> zfile.txt 2>&1&

1

Aşağıdaki komutu çalıştırabilirsiniz.

nohup <your command> & >  <outputfile> 2>&1 &

örneğin script içinde nohup komutum var

./Runjob.sh > sparkConcuurent.out 2>&1
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.