Solicitud de Bash debajo de la salida - Cola de registro de fondo


15

Solía ​​trabajar para una empresa que tenía un shell personalizado para la administración de uno de sus productos que se ejecutaba en Linux y estoy buscando replicar una característica clave de este shell.

Todo el trabajo se realizó mediante un proceso en segundo plano y la salida del registro se mostró a todos los usuarios conectados.

El registro se colará en el fondo a su shell, y la línea de aviso siempre permanecerá perfectamente en la parte inferior.

Por ej.

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

La forma en que intenté hacer esto con bash fue iniciar una cola separada en el archivo .bashrc de los usuarios, pero cuando el resultado del comando se envía a stdout, aparece bajo el indicador de bash, por ejemplo

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

Y el usuario tendría que presionar enter o CtrlCpara una línea de solicitud limpia.

No tengo ideas sobre cómo hacer que el mensaje siempre salte al final de la salida y creo que estoy usando la terminología incorrecta para encontrar algo en Google, ya que no tengo suerte. ¿Alguien sabe cómo hacer esto? con bash?


1
¿Desea la actualización de salida al instante o cuando recibe un nuevo aviso?
ahilsend

Al instante, por lo que es lo más idéntico posible a simplemente ejecutar "tail -f", pero con el mensaje en la parte inferior.
iamacarpet

¿Qué sucede con la tail -fsalida y la solicitud y la salida del comando cuando ingresa un comando que tiene una cantidad significativa de salida, especialmente cuando su proceso en segundo plano está enviando activamente su salida?
Pausado hasta nuevo aviso.

En su caso, los comandos que se ejecutarían solo causaron resultados a través del proceso en segundo plano, no por sí solos, por lo que no fue un problema. En este caso, una vez que obtengamos una solución que proporcione el efecto deseado, creo que sería un caso de jugar y ver cuán malo sería el resultado de mezclarse de una implementación a otra.
iamacarpet

1
Entonces, apoyo firmemente la sugerencia de usar screen o tmux. La salida no se mezclará ni luchará por el espacio de la pantalla y puede cambiar el tamaño de las ventanas (mover la división) y desplazarlas de forma independiente. Si su objeción es que las líneas de encabezado / pie de página / estado son "pesadas", existe la posibilidad de configurar eso. Sin ruedas reinventadas.
Pausado hasta nuevo aviso.

Respuestas:


1

Lo siguiente hace lo que necesita, sin usar tmux o screen u otros programas. Mantiene el aviso en la parte inferior. Reemplace "/ var / log / cron" con el archivo que necesite:

#!/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 clave para esto son los caracteres de control ANSI para el terminal. Particularmente la declaración "\ e [x; y" que establece una nueva área desplazable. Entonces, a medida que se lee cada línea del archivo de registro, la línea inferior de la ventana se excluye del área desplazable, se inserta la línea del archivo de registro y luego se vuelve a agregar la parte inferior.


Gracias Michael, eso funciona muy bien =] - Tengo el problema ocasional de que estás escribiendo mientras hay una gran cantidad de desplazamiento de la línea de registro, no puedes retroceder todo el texto en la línea de tu consola (estaba probando con un registro de Apache ocupado), pero para lo que quiero usarlo, no debería ser un problema.
iamacarpet

@iamacarpet Impresionante. Me alegra que funcione para ti.
Michael Martinez

11

La respuesta es screen o tmux se ha utilizado

Explicaré cómo puedes configurarlo usando la pantalla

1) Instale la pantalla usando apt-get install screenUbuntu / Debian o yum install screenderivados de RedHat.

2) screen -S shell_and_logs

3) Luego presione Ctrl+ a, seguido de S(S mayúscula).
Aparecerá una pantalla horizontal.

4) Presione Ctrl+ aseguido de TAB
Esto saltará a la segunda ventana dividida.

5) Cree otra ventana aquí para obtener el símbolo del sistema presionando Ctrl+ asuelte las teclas y luego presionec

6) Puede cambiar el tamaño de la segunda ventana presionando Ctrl+ y aluego escribiendo, :resizedespués de lo cual Lines:aparecerá. Ingrese el número de líneas que desea mostrar.

7) Finalmente puedes cambiar entre ventanas por Ctrl+ aseguido deTAB

Ver ejemplo a continuación


Gracias val0x00ff, me gusta la idea, hace el trabajo, pero no parece tan limpia como la experiencia que proporcionó el sistema en cuestión. Para un usuario inexperto, no es tan transparente: obviamente es otro shell, en lugar de sentir que su shell principal lo mantiene actualizado.
iamacarpet

@iamacarpet tail -F /var/log/messages &es otra forma de mostrarle mensajes cuando algo cambia, por ejemplo, cuando se descubre un error de inicio de sesión o cuando algún servicio tiene problemas. Sin embargo, esto no es ideal ya que ensuciará su shell interactivo.
Valentin Bajrami

Sí, eso es exactamente lo que estaba preguntando, una forma de hacerlo sin estropear el shell interactivo, ya que eso es lo que habían logrado hacer en el shell de las empresas, pero sería bueno no tener que escribir un shell desde cero para lograrlo
iamacarpet

1
@iamacarpet Hay muchas otras herramientas además screeny tmuxeso puede hacer esto, por ejemplo, algunos de los BSD se envían con un windowcomando. Sin embargo, dada la opción, recomendaría esta solución sobre un shell personalizado u otras opciones disponibles debido a su flexibilidad. Puede que no sea tan transparente para el usuario final, pero realmente no notarán la diferencia, y los usuarios avanzados / administradores de sistemas podrán usar la flexibilidad adicional que ofrecen screen.
voretaq7

@iamacarpet t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"Póngalo en un script y ejecútelo cada vez que lo desee. Gracias a geirha por esto en #bash @ irc.freenode.org
Valentin Bajrami
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.