Existe-t-il un équivalent de la commande "log" de GNU Screen dans tmux?

35

J'utilise beaucoup la commande "log" de screen pour consigner la sortie d'une session dans un fichier lorsque je modifie un environnement donné. J'ai cherché dans la page de manuel de tmux, mais je n'ai pas trouvé d'équivalent. Est-ce que quelqu'un est au courant d'une fonctionnalité similaire dans tmux ou dois-je écrire mes propres scripts de wrapper pour le faire?

EDIT: Je connais le 'script' et d'autres utilitaires qui me permettent de consigner une session. La fonctionnalité de screen est si utile est la possibilité de définir une variable de fichier journal qui utilise des échappements de chaîne pour identifier chaque session de manière unique.

Par exemple, j'ai une fonction shell qui, à partir d'un nom d'hôte, envoie SSH à cet hôte dans une nouvelle fenêtre et définit le titre de la fenêtre sur le nom d'hôte. Lorsque je commence un journal de cette session, il est préfixé par le titre de la fenêtre.

Si cette fonctionnalité n'existe pas dans tmux, je devrai créer un nouvel ensemble de fonctions shell pour configurer les "scripts" des sessions que je souhaite consigner. Ce n'est pas extrêmement difficile, mais cela ne vaut peut-être pas la peine, car l'écran fait exactement ce dont j'ai besoin.

Murali Suriar
la source

Réponses:

39

Laissez-moi voir si j'ai bien déchiffré votre configuration d' écran :

  • Vous utilisez quelque chose comme logfile "%t-screen.log"(probablement dans un .screenrcfichier) pour configurer le nom du fichier journal qui sera démarré plus tard.
  • Vous utilisez la commande d' écrantitle <hostname> (Ca A) pour définir le titre d'une nouvelle fenêtre ou vous démarrez une nouvelle session d'écran.
    screen -t <hostname> ssh0 <hostname>
  • Vous utilisez la commande d' écran Ca H (Ca: log) pour basculer l'enregistrement dans le fichier configuré.

Si c'est le cas, alors est presque équivalent (nécessite tmux 1.3+ pour prendre en charge #W dans la pipe-panecommande shell; pipe-paneest disponible dans tmux 1.0+):

  • Dans un fichier de configuration (par exemple .tmux.conf):

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • Utilisation tmux rename-window <hostname>(Cb,) pour renommer une fenêtre existante, ou
    utiliser tmux new-window -n <hostname> 'ssh <hostname>'pour démarrer une nouvelle tmux fenêtre, ou
    utiliser tmux new-session -n <hostname> 'ssh <hostname>'pour démarrer une nouvelle tmux session.
  • Utilisez Cb H pour activer l’enregistrement.

Il n'y a aucune notification indiquant que le journal a été modifié, mais vous pouvez en ajouter un si vous le souhaitez:

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

Remarque: la ligne ci-dessus s’affiche comme s’il s’agissait d’un fichier de configuration ( .tmux.confou vous-même source). tmux a besoin de voir la barre oblique inversée et le point-virgule; si vous voulez configurer ceci depuis un shell (par exemple tmux bind-key …), vous devrez alors échapper ou citer les deux caractères de manière appropriée pour qu'ils soient livrés à tmux intacts. Il ne semble pas y avoir de moyen pratique d’afficher différents messages permettant d’activer ou de désactiver différents messages lorsqu’on utilise une seule liaison (vous pouvez peut-être ajouter quelque chose if-shell, mais ce serait probablement moche). Si deux liaisons sont acceptables, essayez ceci:

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'
Chris Johnsen
la source
Agréable! Cela a l'air de faire à peu près exactement ce dont j'ai besoin.
Murali Suriar
Hrrm. Tenter de faire cela à partir du shell pose donc quelques problèmes. Avez-vous des suggestions sur la façon de passer intact la ligne entière à tmux? "
Murali Suriar
2
@KamilDziedzic: Vous pouvez essayer d'inclure une tmux pipe-pane …commande dans votre commande default-command(c'est-à-dire avant de démarrer un shell); bien sûr, cela ne fonctionnerait que pour les volets «par défaut» (rien n'a commencé avec des commandes explicites, par exemple new-window sqlite3). Il y a eu des allusions sur le fait que le support “hook” pourrait atterrir dans une version future de tmux ; cela peut vous permettre de configurer une commande (par exemple pipe-pane …) à exécuter automatiquement après une autre commande new-session, new-windowou split-pane).
Chris Johnsen
1
@sebelk: Si vous considérez une ligne individuelle comme une "entrée", vous pouvez utiliser un shell readet l' datearranger. Par exemplebind-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, ... qui pourrait en beaucoup plus efficace si nous savions bash était de 4,1 ou plus récent - fraie un sous - shell pour lancer une nouvelle copie de datechaque ligne de sortie va être un sérieux coup de performance! Mieux vaut printf '%(%Y%m%dT%H%M%S)T: %s\n' "$line"(éviter autant que nécessaire d’être inclus dans un fichier de configuration tmux, donc sans doute doubler le %set échapper le "s).
Charles Duffy
5

Voici un plugin tmux qui permet de se connecter sans interférer avec les raccourcis clavier .tmux.conf:

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

Fonctionnalités:

  • prefix + Pbascule la journalisation du volet. La sortie est effacée des caractères ANSI indésirables!
  • prefix + Alt + P enregistre l'historique complet du volet dans un fichier

la source
4

Après avoir parcouru la documentation de tmux, je ne trouve aucun équivalent de la journalisation de la fenêtre de l'écran. Il semble que vous deviez utiliser vos fonctions de shell pour faire ce que vous voulez, ou simplement utiliser screen. Vous pouvez activer le débogage, qui enregistre à la fois le serveur et le client, mais il inclut également de nombreux journaux superflus liés à tmux, ce qui ne correspond pas exactement à ce que vous demandez.

Vous pouvez éventuellement utiliser le presse-papiers de tmux pour automatiser l'enregistrement du tampon dans une autre session, qui serait configurée pour accepter le contenu du presse-papiers et être enregistrée dans un fichier. Cela semble un peu bidon.

jsbillings
la source
1
C'était aussi ma conclusion. J'ai décidé de m'en tenir à l'écran pour le moment, ce qui est dommage, car, mis à part cet oubli, tmux semble plutôt sympa.
Murali Suriar le
1

je le fais en utilisant un script, cela provient de mon fichier 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"
0xC0000022L
la source
1
Un remplacement médiocre de la logcommande screen , qui permet de se connecter à la volée. Mais si vous êtes dans tmux et que vous voulez utiliser la journalisation de l'écran, vous devez quand même démarrer un nouveau shell.
Arcege