Menggunakan top
perintah dengan pengalihan berfungsi dengan baik:
top > top.log
Sekarang saya ingin menggunakan grep untuk memfilter baris tertentu:
top | grep "my_program" > top.log
Tetapi file log akan tetap kosong. Tetapi grep memberikan output saat menggunakan
top | grep "my_program"
Di mana my_program
harus diganti oleh program yang sedang berjalan untuk melihat beberapa output.
Mengapa pendekatan saya tidak berhasil? Dan bagaimana cara memperbaikinya?
-b
opsitop
atau menggunakanps
sebagai gantinya.-b
tidak memecahkan masalah saya, tetapi memecahkan beberapa masalah penyandian. Terima kasih.Jawaban:
Saya mendapatkan perilaku yang sama yang Anda gambarkan. Di Ubuntu 11.10
tidak menghasilkan output apa pun.
Saya percaya alasan untuk ini adalah bahwa grep sedang buffering outputnya. Untuk memberi tahu GNU grep untuk memuntahkan output baris demi baris, gunakan
--line-buffered
opsi:Lihat juga pertanyaan SO ini untuk solusi potensial lainnya.
sumber
--line-buffered
memecahkan masalah.-b
pilihan adalah masih nasihat yang baik dari Lev Levitsky, juga. Itu memecahkan beberapa masalah pengodean dengan file log.kamu harus menggunakan:
"-n 1" berjalan di atas untuk satu iterasi dan kemudian berhenti bukannya terus memperbarui setiap beberapa detik
karena Anda hanya mencari satu baris meskipun ps akan menjadi alat yang lebih baik untuk digunakan.
sumber
Solusi saya untuk masalah ini adalah:
Dengan cara ini saya bisa memiliki monitor yang sedang berjalan di latar belakang untuk my_program dan menyimpan semua hasil di file top.log.
sumber
Coba ini:
Apa artinya
2>&1
?sumber
Meskipun keduanya bekerja untuk saya, saya pikir saran Lev Levitsky adalah yang benar. Gunakan
-b
argumennya.Ada kemungkinan besar bahwa redirection output adalah masalahnya dan Anda tidak mendapatkan apa-apa melalui stdout, jadi coba ini sebagai gantinya:
Perhatikan bahwa Anda mungkin memiliki masalah dengan buffering output juga. Shell Anda tidak akan terus-menerus menulis ke file sehingga perlu waktu cukup lama untuk
top.log
diisi.sumber