Esiste un equivalente del comando "log" di GNU Screen in tmux?


35

Uso intensamente il comando "log" dello schermo per registrare l'output di una sessione in un file, quando sto apportando modifiche in un determinato ambiente. Ho cercato nella pagina man di tmux, ma non sono riuscito a trovare un equivalente. Qualcuno è a conoscenza di una funzionalità simile in tmux o devo scrivere i miei script wrapper per farlo?

EDIT: sono a conoscenza di "script" e altre utilità che mi consentono di registrare una sessione. Il motivo per cui la funzionalità dello schermo è così utile è la possibilità di definire una variabile del file di log che utilizza gli escape di stringa per identificare in modo univoco ogni sessione.

ad es. ho una funzione shell che, dato un nome host, porterà SSH a quell'host in una nuova finestra dello schermo e imposta il titolo della finestra sul nome host. Quando avvio un registro di quella sessione, è preceduto dal titolo della finestra.

Se questa funzionalità non esiste in tmux, dovrò creare un nuovo set di funzioni shell per impostare gli "script" delle sessioni che voglio registrare. Questo non è estremamente difficile, ma potrebbe non valere la pena, dato che lo schermo fa esattamente quello di cui ho già bisogno.

Risposte:


39

Fammi vedere se ho decifrato correttamente la configurazione dello schermo :

  • Si utilizza qualcosa di simile logfile "%t-screen.log"(probabilmente in un .screenrcfile) per configurare il nome del file di registro che verrà avviato in seguito.
  • È possibile utilizzare il title <hostname>(Ca A) schermo comando per impostare il titolo di una nuova finestra, o
    si fa screen -t <hostname> ssh0 <hostname>per iniziare una nuova sessione di screen.
  • Si utilizza il comando dello schermo Ca H (Ca: log) per attivare o disattivare la registrazione nel file configurato.

Se è così, allora è quasi equivalente (richiede tmux 1.3+ per supportare #W nel pipe-panecomando shell; pipe-paneè disponibile in tmux 1.0+ ):

  • In un file di configurazione (ad es. .tmux.conf):

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • Utilizzare tmux rename-window <hostname>(Cb,) per rinominare una finestra esistente oppure
    utilizzare tmux new-window -n <hostname> 'ssh <hostname>'per avviare una nuova finestra di tmux o
    utilizzare tmux new-session -n <hostname> 'ssh <hostname>'per avviare una nuova sessione di tmux .
  • Utilizzare Cb H per attivare / disattivare la registrazione.

Non c'è notifica che il registro sia stato attivato, ma è possibile aggiungerne uno se si desidera:

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

Nota: la riga sopra è mostrata come se fosse in un file di configurazione (uno .tmux.confo uno tu source). tmux deve vedere sia la barra rovesciata che il punto e virgola; se vuoi configurarlo dalla a shell (ad es. tmux bind-key …), dovrai scappare o citare entrambi i caratteri in modo appropriato in modo che vengano consegnati a tmux intatti. Non sembra esserci un modo conveniente per mostrare diversi messaggi per attivare / disattivare l'attivazione / disattivazione quando si utilizza solo un singolo binding (potresti essere in grado di sistemare qualcosa con if-shell, ma probabilmente sarebbe brutto). Se due binding sono accettabili, prova questo:

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'

Bello! Questo sembra fare esattamente ciò di cui ho bisogno.
Murali Suriar,

Hrrm. Quindi, tentare di farlo dalla shell comporta alcuni problemi. Qualche suggerimento su come gestire il passaggio dell'intera linea in modo che sia intatto? "
Murali Suriar

2
@KamilDziedzic: potresti provare a includere un tmux pipe-pane …comando nel tuo default-command(cioè prima di iniziare una shell); ovviamente funzionerebbe solo per i pannelli "predefiniti" (nulla è iniziato con comandi espliciti, ad es new-window sqlite3.). Ci sono state indicazioni che il supporto "hook" potrebbe arrivare in qualche versione futura di tmux ; questo potrebbe permettere di configurare un comando (per esempio pipe-pane …) per essere eseguito automaticamente dopo qualche altro comando new-session, new-windowo split-pane).
Chris Johnsen,

1
@sebelk: se consideri una singola riga come una "voce", puoi usare una shell reade dateorganizzarla. Ad esempiobind-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, ... ciò potrebbe rendere molto più efficiente se sapessimo che bash era 4.1 o più recente - la generazione di una subshell per eseguire una nuova copia di dateper ogni linea di output sarà un serio successo in termini di prestazioni! Molto meglio printf '%(%Y%m%dT%H%M%S)T: %s\n' "$line"(scappare se necessario per l'inclusione in un file di tmux config, presumibilmente raddoppiando %se scappando ").
Charles Duffy,

5

Ecco un plugin tmux che abilita la registrazione senza pasticciare con le combinazioni di tasti in .tmux.conf:

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

Caratteristiche:

  • prefix + Pattiva / disattiva la registrazione dei riquadri. L'output viene cancellato da caratteri ANSI indesiderati!
  • prefix + Alt + P salva la cronologia completa dei riquadri in un file

4

Dopo aver consultato la documentazione di tmux, non riesco a trovare alcun equivalente della registrazione della finestra dello schermo. Sembra che dovresti usare le funzioni della shell per fare quello che vuoi, o semplicemente usare lo schermo. Puoi attivare il debug, che registra sia il lato server sia quello client, ma include anche molti registri estranei relativi a tmux, quindi non sarebbe esattamente quello che stai chiedendo.

È possibile utilizzare gli Appunti di tmux per automatizzare il salvataggio del buffer in un'altra sessione, che sarebbe impostata per accettare il contenuto degli Appunti e salvarlo in un file. Sembra una specie di hacker.


1
Anche questa è stata la mia conclusione. Per ora ho deciso di restare con lo schermo, il che è un peccato, dato che oltre a questa svista, tmux sembra piuttosto carino.
Murali Suriar,

1

lo faccio usando lo script, questo è dal mio file 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
Una sostituzione scadente al logcomando dello schermo , che consente la registrazione al volo. Ma poi se sei in tmux e vuoi usare la registrazione dello schermo, devi comunque avviare una nuova shell.
Arcege,
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.