Prompt di Bash sotto Output - Coda di registro in background


15

Lavoravo per un'azienda che aveva una shell personalizzata per la gestione di uno dei suoi prodotti che era in esecuzione su Linux e sto cercando di replicare una funzionalità chiave di questa shell.

Tutto il lavoro è stato svolto da un processo in background e l'output del registro è stato visualizzato a tutti gli utenti connessi.

Il registro si adatterà in background alla shell e la riga del prompt rimarrà sempre perfettamente in fondo.

Per es

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

Il modo in cui ho provato a farlo con bash è stato quello di avviare una coda distaccata nel file .bashrc degli utenti, ma quando l'output del comando viene inviato a stdout - arriva sotto il prompt di bash, ad es.

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

E l'utente dovrebbe premere invio o CtrlCper una riga di comando pulita.

Sono fuori di idee su come fare in modo che il prompt salti sempre in fondo all'output e penso che sto usando la terminologia sbagliata per trovare qualcosa su Google in quanto non ho fortuna - qualcuno sa come farlo con bash?


1
Desideri l'aggiornamento dell'output istantaneamente o quando ricevi un nuovo prompt?
Ahilsend,

Immediatamente, quindi è il più identico possibile semplicemente eseguendo "tail -f", ma con il prompt in fondo.
iamacarpet,

Cosa succede tail -fall'output, al prompt e all'output del comando quando si immette un comando che ha una quantità significativa di output, specialmente quando il processo in background sta inviando attivamente il suo output?
In pausa fino a ulteriore avviso.

Nel loro caso, i comandi che sarebbero stati eseguiti causavano solo l'output tramite il processo in background, non da soli, quindi non era un problema. In questo caso, una volta ottenuta una soluzione che dà l'effetto desiderato, penso che sarebbe un caso di giocare e vedere quanto male sarebbe il mixaggio dell'output su una base da implementazione a implementazione.
iamacarpet,

1
Quindi sostengo fortemente il suggerimento di usare screen o tmux. L'output non verrà mischiato o combattuto per lo spazio dello schermo e puoi ridimensionare le finestre (spostare la divisione) e scorrere in modo indipendente. Se la tua obiezione è che l'intestazione / piè di pagina / le linee di stato sono "pesanti", c'è qualche possibilità di configurarlo. Nessuna ruota reinventata.
In pausa fino a ulteriore avviso.

Risposte:


1

Quanto segue fa ciò di cui hai bisogno, senza usare tmux o screen o altri programmi. Mantiene il prompt in basso. Sostituisci "/ var / log / cron" con qualsiasi file ti serva:

#!/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

la chiave per questo sono i caratteri di controllo ANSI per il terminale. In particolare l'istruzione "\ e [x; y" che imposta una nuova area scorrevole. Pertanto, quando viene letta ogni riga del file di registro, la riga inferiore della finestra viene esclusa dall'area scorrevole, la riga dal file di registro viene inserita, quindi la parte inferiore viene aggiunta nuovamente.


Grazie Michael, funziona magnificamente =] - Ho il problema occasionale che stai scrivendo mentre c'è molta linea di log che scorre, non puoi backspace tutto il testo sulla tua console (stavo provando con un log di Apache occupato), ma per quello che voglio usarlo, non dovrebbe essere un problema.
iamacarpet,

@iamacarpet Fantastico. Sono contento che funzioni per te.
Michael Martinez,

11

La risposta è screen o tmux è stato usato

Spiegherò come è possibile configurare tale utilizzando lo schermo

1) Installa lo schermo usando apt-get install screensu Ubuntu / Debian o yum install screenRedHat derivati.

2) screen -S shell_and_logs

3) Quindi premere Ctrl+ a, seguito da S(S maiuscola).
Apparirà una schermata orizzontale

4) Premere Ctrl+ aseguito da TAB
Questo salterà alla seconda finestra divisa.

5) Creare un'altra finestra qui in modo da ottenere il prompt dei comandi premendo Ctrl+ arilasciare i tasti quindi premerec

6) È possibile ridimensionare il secondo windo premendo Ctrl+, aquindi digitando :resizedopo di che Lines:verrà visualizzato. Inserisci il numero di righe che vuoi mostrare.

7) Finalmente puoi passare da Windows a Ctrl+ aseguito daTAB

Vedi esempio sotto


Grazie val0x00ff - mi piace l'idea, fa il lavoro - ma non sembra pulito come l'esperienza fornita dal sistema in questione. Per un utente inesperto, non è così trasparente - è ovviamente un'altra shell, piuttosto che sentirsi come la shell principale ti tiene aggiornato.
iamacarpet,

@iamacarpet tail -F /var/log/messages &È un altro modo per mostrarti messaggi quando qualcosa cambia, ad esempio quando viene rilevato un errore di accesso o quando alcuni servizi presentano problemi. Questo, tuttavia, non è l'ideale poiché rovinerà la tua shell interattiva.
Valentin Bajrami il

Sì, è esattamente quello che stavo chiedendo - un modo per farlo senza incasinare la shell interattiva - poiché è quello che sono riusciti a fare sulla shell della società - ma sarebbe bello non dover scrivere una shell da zero per realizzarlo.
iamacarpet,

1
@iamacarpet Ci sono un sacco di altri strumenti oltre screene tmuxche possono fare questo - per esempio alcune delle BSD nave con un windowcomando. Data la scelta, però, consiglierei questa soluzione su una shell personalizzata o su altre opzioni disponibili a causa della sua flessibilità. Potrebbe non essere così trasparente per l'utente finale, ma in realtà non conosceranno la differenza e gli utenti / amministratori di sistema saranno in grado di utilizzare la flessibilità aggiuntiva offerta da screen.
voretaq7,

@iamacarpet t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"Inseriscilo in uno script ed eseguilo ogni volta che vuoi. Grazie a geirha per questo a #bash @ irc.freenode.org
Valentin Bajrami il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.