Unix / linux üzerinde tamponlama yapmadan çıktıyı bir dosyaya yönlendirmenin bir yolu var mı?


49

Bazı hata ayıklama ve işlem bilgilerini stdout'a çıkaran uzun süren bir toplu işlem var. Eğer sadece bir terminalden kaçarsam, 'nerede olduğunu' takip edebilirim ancak veriler çok fazla olur ve ekrandan aşağı kayar.

'> Out.txt' dosyasına bir dosyaya yönlendirirsem, sonunda tüm çıktıyı alıyorum ancak arabelleğe alınır, böylece şu an ne yaptığını artık göremiyorum.

Çıkışı yönlendirmek için bir yazı var mı?


1
Lütfen aşağıdaki (ve cnst 'ler) "tartışmam" ’a bir göz atabilir misiniz? İstediğiniz tek şey çıktıyı bir dosyaya kaydederken aynı anda görmek olduğunu tahmin ediyorum. Bir çözüm bulduysanız, bize bildirin;)!
Benj

Yanıtlar:


52

Standart akışların arabelleğe alma seçeneklerini açıkça setvbufC kullanarak bir çağrı kullanarak ayarlayabilirsiniz ( bu bağlantıya bakın ), ancak mevcut bir programın davranışını değiştirmeye çalışıyorsanız deneyin stdbuf( coreutilssürüm 7.5 ile başlamanın bir parçası ).

Bu stdout, bir satıra kadar arabellekleri :

stdbuf -oL command > output

Bu stdouttamamen arabelleklemeyi devre dışı bırakır :

stdbuf -o0 command > output

aaarghhh ... Ubuntu'm sadece 7.4
çekirdek içeriyor

@Calmarius: coreutils'in derlenmesi oldukça kolay olmalı. Sadece ftp.gnu.org/gnu/coreutils adresinden yeni bir sürüm alın ve hemen başlayın . Bu standart ./configure && makeücrettir. Daha sonra kurmak zorunda değilsiniz, sadece stdbufikiliyi kullanabilirsiniz src/.
Eduardo Ivanec

çift ​​argh. Eski bir centos distro ve OSX gibi Ubuntu'da buna ihtiyacım var.
edk750


Bilinen PID ile halihazırda çalışan bir işlem için boru / baskı tamponlarını harici olarak zorlamanın bir yolu var mı?
Mvorisek

9

Aşağıdaki scriptgibi komutu kullanarak bir dosyaya satır tamponlanmış çıktı elde edebilirsiniz :

stty -echo -onlcr   # avoid added \r in output
script -q /dev/null batch_process | tee output.log        # Mac OS X, FreeBSD
script -q -c "batch_process" /dev/null | tee output.log   # Linux
stty echo onlcr

-1 çünkü: a) kabul edilen cevabın aksine, komutu arka planda çalıştırmak istiyorsanız (yukarıdaki komutu batch_processeklerseniz &, en azından Linux kutumda komut hemen bitmez), ki bu görünmez. Son derece yaygın bir kullanım durumu gibi, ve b) bu ​​kaynağın nasıl çalıştığı hakkında hiçbir açıklama yok.
Mark Amery

8

Ubuntu'da, unbufferprogram ( expect-devpaketten) paketi benim için hile yaptı. Sadece koş:

unbuffer your_command

ve onu tamponlamaz.


6

Bulduğum en kolay çözüm (kurulmuş herhangi bir üçüncü taraf paketine gerek yoktu) Unix ve Linux sitesinde benzer bir başlıkta bahsedildi : scriptkomutu kullan. Eski ve muhtemelen zaten kurulu.

$ script -q /dev/null long_running_command | print_progress       # FreeBSD, Mac OS X
$ script -q -c "long_running_command" /dev/null | print_progress  # Linux

Not için ilk dosya adı parametre scriptkomutuyla yazılacak günlük dosyasıdır . Basitçe script -q your_commandkoşarsanız, log dosyasıyla çalıştırmak için girdiğiniz komutun üzerine yazacaksınız. Denemeden man scriptönce güvende olup olmadığını kontrol edin .


4

scriptkomutu dene ; eğer sisteminizde varsa, dosya adını argüman olarak alır, stdout'a gönderilen tüm metinler dosyaya kopyalanır. Bir kurulum programı etkileşim gerektirdiğinde çok faydalıdır.


'Script-a out.txt' numarasını biliyorum. Yazma işlemini arabelleğe almamak için başka bir yol olup olmadığını merak ediyordum.
James Dean

3

Şahsen incelemek istediğim bir komutun boru çıkışını tercih ediyorum tee.

scripttuşa basma zamanlaması ve yazdırılamayan çok sayıda karakter dahil olmak üzere çok fazla bilgi kaydeder. Ne teekazandırır çok daha insan okunabilir benim için.


Ayrıca komut satırına "| less" eklerdim.
HUB

4
Bunun teetamponlamadan da etkilendiğinden eminim . Çıktıyı findkomutlardan ayırırken hala tee tarafından görüntülenen kısmi satırları alıyorum .
Magellan

2

Çıkışı bir dosyaya yönlendirin ve dosyayı tail -fkomutla izleyin .

Düzenle

Bu hala tamponlama çekiyorsa, syslog tesisini kullanın (genellikle tamponsuz). Toplu işlem bir kabuk betiği olarak çalışıyorsa, bunu yapmak için logger komutunu kullanabilirsiniz. Toplu iş bir betik dilinde çalışıyorsa, yine de bir kayıt tesisi bulunmalıdır.


3
Şu an bunu yapıyorum ama süreç dosyaya yazma arabelleği ve sadece önlemek istediğim bu.
James Dean,

Güncellenmiş bir teklif için düzenlememe bakın.
wolfgangsz

1
Bu bariz sebeplerden dolayı işe yaramıyor. This answer is usefulİşe yaramayan ve muhtemelen işe yaramayan cevaplar için kim cehennem veriyor ?
00’da

1

teeKomutu kullanabilirsin , sadece sihir!

someCommand | tee logFile.logolacak hem konsolda ekran ve günlük dosyası içine yazın.


Çalışmıyor teehiçbir tamponlamanın gerçekleşmesini durdurmayacaktır.
cnst

1
@cnst Etkili olarak, teebazı tamponlamalardan kaçınmayacak , ancak yalnızca çıktının ne olduğuna bakmanıza izin verecek. Bu @JamesDean'ın istediği şeydi (sorusunu çözdüğüm gibi), ancak tamponlamanın gerçekten sorun olmadığını düşünüyorum. Daha fazla ayrıntı varsa, bana bildirin.
Benj

Çıktıyı görmek istedi ve hiç çıktı almadı (tamponsuz bir şekilde), ve yine teede çıktı alınamayan çıktıda daha iyi bir görüş elde etmek için kullanmayı mı önerirsiniz ?
saat

1
Nasıl kırmızı @JamesDean soru: "'out.txt' bir dosyaya çıktı yönlendirmek" yönlendirmek benim için hiçbir konsol çıkışı, tüm çıktı yönlendirilirken işlemin tamamlanmasını bekleyin. Kullanırken >konsolda hiçbir şey görmüyorsunuz. Sanırım @JamesDean bunu tarif etmek için "tamponlama" kelimesini kullanıyor. Ne istediği hakkında daha fazla şey söylemesi için sorusu hakkında yorum yapacağım.
Benj
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.