Bash Prompt Dibawah Output - Background Log Tail

15

Saya dulu bekerja untuk perusahaan yang memiliki shell khusus untuk manajemen salah satu produk mereka yang berjalan di Linux dan saya ingin mereplikasi fitur utama shell ini.

Semua pekerjaan dilakukan oleh proses latar belakang dan output dari log ditampilkan ke semua pengguna yang terhubung.

Log akan mengikuti latar belakang shell Anda, dan baris prompt akan selalu tetap sempurna di bagian bawah.

Untuk misalnya

Log line 1
Log line 2
Log line 3
![ROOT@PRODUCT51-LIVE]:~/ #

Cara saya mencoba melakukan ini dengan bash adalah untuk memulai ekor terpisah di file .bashrc pengguna, tetapi ketika output dari perintah dikirim ke stdout - ia datang di bawah bash prompt, misalnya

![ROOT@PRODUCT51-LIVE]:~/ #Log line 1
Log line 2
Log line 3

Dan pengguna harus menekan enter atau CtrlCuntuk baris prompt bersih.

Saya kehabisan ide tentang cara membuat prompt selalu melompat ke bagian bawah output dan saya pikir saya menggunakan terminologi yang salah untuk menemukan apa pun di Google karena saya tidak beruntung - apakah ada yang tahu bagaimana melakukan ini dengan bash?

iamacarpet
sumber
1
Anda ingin pembaruan output secara instan atau ketika Anda mendapatkan prompt baru?
ahilsend
Seketika, jadi ini sama identiknya dengan hanya menjalankan "tail -f", tetapi dengan prompt di bagian bawah.
iamacarpet
Apa yang terjadi pada tail -foutput dan prompt dan output perintah ketika Anda memasukkan perintah yang memiliki jumlah output yang signifikan, terutama ketika proses latar belakang Anda secara aktif mengirimkan outputnya?
Dijeda sampai pemberitahuan lebih lanjut.
Dalam kasus mereka, perintah yang akan dijalankan hanya menyebabkan output melalui proses latar belakang, bukan pada mereka sendiri, jadi itu bukan masalah. Dalam hal ini, setelah kami mendapatkan solusi yang memberikan efek yang diinginkan, saya pikir itu akan menjadi kasus bermain dan melihat seberapa buruk output akan bercampur pada implementasi-ke-implementasi.
iamacarpet
1
Maka saya sangat mendukung saran menggunakan layar atau tmux. Output tidak akan tercampur atau memperjuangkan ruang layar dan Anda dapat mengubah ukuran windows (pindahkan split) dan gulir secara mandiri. Jika keberatan Anda adalah baris header / footer / status menjadi "berat", ada beberapa kemampuan untuk mengonfigurasinya. Tidak ada roda yang diciptakan kembali.
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:

1

Berikut ini melakukan apa yang Anda butuhkan, tanpa menggunakan tmux atau layar atau program lain. Mempertahankan prompt di bagian bawah. Ganti "/ var / log / cron" dengan file apa pun yang Anda butuhkan:

#!/bin/bash 
L=$(tput lines)
L1=${L}
(( L1-- ))
C=$(tput cols)
tput cup ${L} 0
tail -f /var/log/cron | while read line; do 
  tput sc
  printf "\e[1;${L1}r\e[${L1};${C}f" 
  echo; echo ${line}
  printf "\e[1;${L}r" && tput rc
done

kunci untuk ini adalah karakter kontrol ANSI untuk terminal. Khususnya pernyataan "\ e [x; y" yang menetapkan area yang dapat digulir baru. Jadi, ketika setiap baris file log dibaca, garis bawah di jendela dikecualikan dari area yang dapat digulir, baris dari file log dimasukkan, kemudian bagian bawah ditambahkan kembali.

Michael Martinez
sumber
Terima kasih Michael, yang bekerja dengan baik =] - Saya memiliki masalah sesekali saat Anda mengetik sementara ada banyak baris log yang bergulir, Anda tidak dapat mundur semua teks pada baris konsol Anda (saya sedang menguji dengan log apache yang sibuk), tetapi untuk apa saya ingin menggunakannya, seharusnya tidak menjadi masalah.
iamacarpet
@iamacarpet Luar Biasa. Senang itu berhasil untuk Anda.
Michael Martinez
11

Jawabannya adalah layar atau tmux telah digunakan

Saya akan menjelaskan bagaimana Anda bisa mengkonfigurasi layar menggunakan seperti itu

1) Pasang layar menggunakan derivasi apt-get install screenUbuntu / Debian atau yum install screenRedHat.

2) screen -S shell_and_logs

3) Kemudian tekan Ctrl+ a, diikuti oleh S(huruf kapital S).
Layar horizontal akan muncul

4) Tekan Ctrl+ adiikuti oleh TAB
Ini akan melompat ke jendela split kedua.

5) Buat jendela lain di sini sehingga Anda mendapatkan prompt perintah dengan menekan Ctrl+ alepaskan tombol lalu tekanc

6) Anda dapat mengubah ukuran windo kedua dengan menekan Ctrl+ alalu mengetik :resizesetelah yang Lines:akan muncul. Masukkan jumlah baris yang ingin Anda tampilkan.

7) Akhirnya Anda dapat beralih antar windows dengan Ctrl+ adiikuti olehTAB

Lihat contoh di bawah ini

Valentin Bajrami
sumber
Terima kasih val0x00ff - Saya suka idenya, ini menyelesaikan pekerjaan - tetapi tidak terlihat sebersih pengalaman yang diberikan sistem yang bersangkutan. Untuk pengguna yang tidak berpengalaman, itu tidak transparan - itu jelas shell lain, bukan hanya merasa seperti shell utama Anda membuat Anda diperbarui.
iamacarpet
@iamacarpet Cara tail -F /var/log/messages &lain untuk menampilkan pesan kepada Anda ketika sesuatu berubah misalnya ketika kegagalan login ditemukan atau ketika beberapa layanan mengalami masalah. Namun ini tidak ideal karena akan mengacaukan shell interaktif Anda.
Valentin Bajrami
Ya itulah yang saya tanyakan - cara untuk melakukan hal itu tanpa mengacaukan shell interaktif - karena itulah yang berhasil mereka lakukan pada shell perusahaan - tetapi alangkah baiknya tidak harus menulis shell dari awal untuk mencapainya.
iamacarpet
1
@iamacarpet Ada banyak alat lain di samping screendan tmuxyang dapat melakukan ini - misalnya beberapa kapal BSD dengan windowperintah. Diberi pilihan meskipun saya akan merekomendasikan solusi ini baik pada shell kustom atau opsi lain yang tersedia karena fleksibilitasnya. Ini mungkin tidak setransparan kepada pengguna akhir, tetapi mereka benar-benar tidak akan tahu bedanya, dan pengguna listrik / sysadmin akan dapat menggunakan fleksibilitas ekstra yang ditawarkan oleh screen.
voretaq7
@iamacarpet t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"Masukkan ke dalam skrip dan jalankan setiap kali Anda inginkan. Terima kasih kepada geirha untuk ini di #bash @ irc.freenode.org
Valentin Bajrami