¿Hay un equivalente del comando "log" de GNU Screen en tmux?


35

Hago un uso intensivo del comando "log" de la pantalla para registrar el resultado de una sesión en un archivo, cuando estoy haciendo cambios en un entorno determinado. Busqué en la página de manual de tmux, pero no pude encontrar un equivalente. ¿Alguien sabe de una característica similar en tmux, o tengo que escribir mis propios scripts de envoltura para hacer esto?

EDITAR: conozco el 'script' y otras utilidades que me permiten registrar una sesión. La razón por la cual la funcionalidad de la pantalla es tan útil es la capacidad de definir una variable de archivo de registro que utiliza escapes de cadena para identificar de forma única cada sesión.

Por ejemplo, tengo una función de shell que, dado un nombre de host, enviará SSH a ese host en una nueva ventana de pantalla y establecerá el título de la ventana en el nombre de host. Cuando comienzo un registro de esa sesión, está prefijado con el título de la ventana.

Si esta funcionalidad no existe en tmux, tendré que crear un nuevo conjunto de funciones de shell para configurar 'scripts' de sesiones que quiero registrar. Esto no es muy difícil, pero puede que no valga la pena el esfuerzo dado que la pantalla hace exactamente lo que ya necesito.

Respuestas:


39

Déjame ver si he descifrado la configuración de tu pantalla correctamente:

  • Utiliza algo como logfile "%t-screen.log"(probablemente en un .screenrcarchivo) para configurar el nombre del archivo de registro que se iniciará más tarde.
  • Se utiliza el title <hostname>(Ca A) pantalla de comando para establecer el título de una nueva ventana, o
    lo haces screen -t <hostname> ssh0 <hostname>para iniciar una nueva sesión de pantalla.
  • Utiliza el comando de pantalla Ca H (Ca: log) para alternar el registro al archivo configurado.

Si es así, es casi equivalente (requiere tmux 1.3+ para admitir #W en el pipe-panecomando de shell; pipe-paneestá disponible en tmux 1.0+):

  • En un archivo de configuración (por ejemplo .tmux.conf):

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • Use tmux rename-window <hostname>(Cb,) para cambiar el nombre de una ventana existente, o
    use tmux new-window -n <hostname> 'ssh <hostname>'para iniciar una nueva ventana de tmux , o
    use tmux new-session -n <hostname> 'ssh <hostname>'para comenzar una nueva sesión de tmux .
  • Use Cb H para alternar el registro.

No hay notificación de que el registro se haya activado, pero puede agregar uno si lo desea:

bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'" \; display-message 'Toggled logging to $HOME/#W-tmux.log'

Nota: La línea anterior se muestra como si estuviera en un archivo de configuración (ya sea .tmux.confuno o usted source). tmux necesita ver tanto la barra diagonal inversa como el punto y coma; si desea configurar esto desde un shell (p tmux bind-key …. ej. ), entonces tendrá que escapar o citar ambos caracteres apropiadamente para que se entreguen a tmux intactos. No parece haber una manera conveniente de mostrar diferentes mensajes para activar / desactivar cuando se usa solo un enlace (es posible que pueda armar algo if-shell, pero probablemente sería feo). Si dos enlaces son aceptables, intente esto:

bind-key H pipe-pane "exec cat >>$HOME/'#W-tmux.log'" \; display-message 'Started logging to $HOME/#W-tmux.log'
bind-key h pipe-pane \; display-message 'Ended logging to $HOME/#W-tmux.log'

¡Agradable! Eso parece hacer exactamente lo que necesito.
Murali Suriar

Hrrm Por lo tanto, intentar hacer esto desde el shell produce algunos problemas. ¿Alguna sugerencia sobre cómo manejar pasar toda la línea a tmux intacta? "
Murali Suriar

2
@KamilDziedzic: puede intentar incluir un tmux pipe-pane …comando en su default-command(es decir, antes de iniciar un shell); por supuesto, eso solo funcionaría para paneles "predeterminados" (nada comenzó con comandos explícitos, por ejemplo new-window sqlite3). Ha habido indicios de que el soporte "enganchado" podría aterrizar en alguna versión futura de tmux ; esto podría permitir que se configura un comando (por ejemplo pipe-pane …) para ejecutarse automáticamente después de algún otro comando new-session, new-windowo split-pane).
Chris Johnsen

1
@sebelk: Si considera que una línea individual es una "entrada", entonces podría usar un shell ready dateorganizar eso. Por ejemplobind-key H pipe-pane -o 'exec bash -c "while IFS= read -r line; do echo \"\$(date +%%Y%%m%%dT%%H%%M%%SZ%%z): \$line\"; done" >>$HOME/"#W-tmux.log"'
Chris Johnsen

1
@ChrisJohnsen, ... eso podría ser mucho más eficiente si supiéramos que bash era 4.1 o más reciente date. Mucho mejor printf '%(%Y%m%dT%H%M%S)T: %s\n' "$line"(escapar según sea necesario para su inclusión en un archivo de configuración de tmux, por lo tanto, presumiblemente duplicando %sy escapando del "s).
Charles Duffy

5

Aquí hay un complemento tmux que permite iniciar sesión sin alterar las combinaciones de teclas en .tmux.conf:

https://github.com/tmux-plugins/tmux-logging

caracteristicas:

  • prefix + Palterna el registro del panel. ¡La salida se borra de los caracteres ANSI no deseados!
  • prefix + Alt + P guarda el historial completo del panel en un archivo

4

Después de mirar la documentación de tmux, no puedo encontrar ningún equivalente al registro de la ventana de la pantalla. Parece que tendría que usar sus funciones de shell para hacer lo que quisiera, o simplemente usar la pantalla. Puede activar la depuración, que registra tanto el lado del servidor como el del cliente, pero también incluye muchos registros extraños relacionados con tmux, por lo que no es exactamente lo que está pidiendo.

Posiblemente podría usar el portapapeles de tmux para automatizar el almacenamiento del búfer en otra sesión, que se configuraría para aceptar el contenido del portapapeles y guardarlo en un archivo. Esto parece un poco hackish.


1
Esa fue mi conclusión también. He decidido seguir con la pantalla por ahora, lo cual es una pena, ya que aparte de este descuido, tmux parece bastante agradable.
Murali Suriar

1

lo hago usando script, esto es de mi archivo tmux.conf

bind ^C new-window "script -f /home/jcosta/mydocs/work/logs/$(date '+%d%m%Y_%H%M%S')_$$.log"
bind c new-window "script -f /home/jcosta/mydocs/work/logs/$( date '+%d%m%Y_%H%M%S')_$$.log"
bind | split-window "script -f /home/jcosta/mydocs/work/logs/$(date '+%d%m%Y_%H%M%S')_$$.log"

1
Un reemplazo pobre del logcomando de la pantalla , que permite iniciar sesión sobre la marcha. Pero luego, si está en tmux y desea utilizar el registro de la pantalla, debe iniciar un nuevo shell de todos modos.
Arcege
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.