Saya memiliki proses batch yang berjalan lama yang menampilkan beberapa debug dan memproses informasi ke stdout. Jika saya hanya menjalankan dari terminal saya dapat melacak 'di mana itu' tetapi kemudian data menjadi terlalu banyak dan muncul dari layar.
Jika saya mengarahkan kembali ke output ke file '> out.txt' Saya mendapatkan seluruh output pada akhirnya tetapi buffered sehingga saya tidak bisa lagi melihat apa yang dilakukannya sekarang.
Apakah ada cara untuk mengarahkan output tetapi membuatnya tidak buffer menulisnya?
Jawaban:
Anda dapat secara eksplisit mengatur opsi buffering stream standar menggunakan
setvbuf
panggilan dalam C (lihat tautan ini ), tetapi jika Anda mencoba untuk memodifikasi perilaku program yang ada cobastdbuf
(bagian daricoreutils
mulai dengan versi 7.5 tampaknya).Ini buffer
stdout
hingga garis:Ini menonaktifkan
stdout
buffering sama sekali:sumber
./configure && make
tarif standar . Anda bahkan tidak perlu menginstalnya setelah itu, Anda hanya dapat menggunakanstdbuf
biner offsrc/
.Anda dapat mencapai output buffered baris ke file dengan menggunakan
script
perintah seperti ini:sumber
batch_process
jika Anda menambahkan&
ke perintah di atas, setidaknya pada kotak Linux saya), yang tampaknya seperti kasus penggunaan yang sangat umum, dan b) tidak ada penjelasan di sini tentang cara kerja mantra ini.Di Ubuntu, paket
unbuffer
program (dariexpect-dev
) melakukan trik untuk saya. Lari saja:unbuffer your_command
dan itu tidak akan menahannya.
sumber
Solusi termudah yang saya temukan (tidak perlu paket pihak ketiga diinstal) disebutkan di utas serupa di situs Unix & Linux : gunakan
script
perintah. Ini sudah tua, dan kemungkinan sudah diinstal.Perhatikan bahwa parameter nama file pertama untuk
script
perintah adalah file log yang akan ditulis . Jika Anda hanya menjalankanscript -q your_command
, Anda akan menimpa perintah yang Anda indentasi untuk dijalankan dengan file log. Periksaman script
, agar aman, sebelum mencobanya.sumber
coba
script
perintahnya; jika sistem Anda memilikinya, dibutuhkan nama file sebagai argumen, semua teks yang dibuang ke stdout akan disalin ke file. Ini sangat berguna ketika program pengaturan membutuhkan interaksi.sumber
Secara pribadi saya lebih suka piping output dari perintah yang ingin saya periksa
tee
.script
merekam terlalu banyak informasi, termasuk waktu penekanan tombol, dan banyak karakter yang tidak dapat dicetak. Apa yangtee
disimpan lebih mudah dibaca oleh manusia untuk saya.sumber
tee
dipengaruhi oleh buffering juga. Saya sering masih mendapatkan garis parsial yang ditampilkan oleh tee ketika memisahkan output darifind
perintah.Redirect output ke file dan ikuti file dengan
tail -f
perintah.Sunting
Jika ini masih mengalami buffering, maka gunakan fasilitas syslog (yang umumnya tidak terbaca). Jika proses batch berjalan sebagai skrip shell, Anda dapat menggunakan perintah logger untuk melakukan ini. Jika pekerjaan batch berjalan dalam bahasa scripting, harus ada fasilitas logging.
sumber
This answer is useful
jawaban yang tidak berhasil, dan tidak mungkin bekerja?Anda dapat menggunakan
tee
perintah, hanya sulap!someCommand | tee logFile.log
keduanya akan ditampilkan di konsol dan menulis ke dalam file log.sumber
tee
tidak akan menghentikan buffering dari terjadi.tee
tidak akan menghindari beberapa buffering tetapi hanya akan memungkinkan Anda untuk melihat apa outputnya. Inilah yang diinginkan @JamesDean (karena saya tidak mengerti pertanyaannya), tapi saya pikir buffering sebenarnya bukan masalah di sini. Jika Anda memiliki detail lebih lanjut, beri tahu saya.tee
untuk mendapatkan tampilan yang lebih baik pada output yang tidak didapat?>
Anda tidak melihat apa pun di konsol. Saya kira @JamesDean menggunakan kata "buffering" untuk menggambarkan itu. Saya akan mengirim komentar pada pertanyaannya untuknya mengatakan lebih banyak tentang apa yang dia inginkan.