在tmux中是否有GNU Screen的“ log”命令的等效项?


35

在给定环境中进行更改时,我大量使用screen的“ log”命令将会话的输出记录到文件中。我搜索了tmux的手册页,但找不到对应的页面。是否有人知道tmux中的类似功能,还是我必须编写自己的包装脚本来做到这一点?

编辑:我知道'脚本'和其他实用程序,允许我记录会话。屏幕功能如此有用的原因是能够定义一个日志文件变量,该变量使用字符串转义符来唯一标识每个会话。

例如,我有一个shell函数,给定一个主机名,它将在新的屏幕窗口中SSH到该主机,并将窗口标题设置为该主机名。当我启动该会话的日志时,它以窗口标题为前缀。

如果tmux中不存在此功能,则必须创建一组新的Shell函数来设置要记录的会话的“脚本”。这并不是很困难,但是鉴于屏幕恰好满足了我的需要,因此不值得付出努力。

Answers:


39

让我看看我是否正确解读了您的屏幕配置:

  • 您使用类似的命令logfile "%t-screen.log"(可能在.screenrc文件中)来配置将在以后启动的日志文件的名称。
  • 您可以使用title <hostname>(Ca A)屏幕命令来设置新窗口的标题,或者
    执行screen -t <hostname> ssh0 <hostname>启动新屏幕会话的操作。
  • 您可以使用Ca H(Ca:log)屏幕命令将日志记录切换到配置的文件。

如果是这样,则几乎相等(需要tmux 1.3+在pipe-paneshell命令中支持#W ;pipe-panetmux 1.0+中可用):

  • 在配置文件(例如.tmux.conf)中:

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • 使用tmux rename-window <hostname>(Cb,)重命名现有窗口,或
    用于tmux new-window -n <hostname> 'ssh <hostname>'启动新的tmux窗口,或
    用于tmux new-session -n <hostname> 'ssh <hostname>'启动新的tmux会话。
  • 使用Cb H切换日志记录。

没有通知已切换日志,但是如果需要,您可以添加一个:

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

注意:上面的行显示为好像在配置文件中(一个.tmux.conf或一个您source)。tmux需要同时看到反斜杠和分号;如果要从shell(例如tmux bind-key …)进行配置,则必须转义或引用两个字符,以便将它们原封不动地传递给tmux。当仅使用单个绑定时,似乎没有一种方便的方法来显示用于切换开/关的不同消息(您可能能够使用来绑定某些内容if-shell,但这可能很丑陋)。如果可以接受两个绑定,请尝试以下操作:

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'

真好!看起来几乎可以满足我的需求。
Murali Suriar

嗯 因此,尝试从外壳执行此操作会产生一些问题。关于如何管理将整条线完整地传递给tmux的任何建议?”
Murali Suriar

2
@KamilDziedzic:您可以尝试tmux pipe-pane …在您的命令中包含命令default-command(即,在启动外壳程序之前);当然,这仅适用于“默认”窗格(例如,任何内容都不以显式命令开头new-window sqlite3)。有迹象表明,“钩子”支持可能会在将来的tmux版本中出现。这可能让你配置一个命令(例如pipe-pane …)一些其它的命令后,自动运行new-sessionnew-windowsplit-pane)。
克里斯·约翰森

1
@sebelk:如果您认为单个行是一个“条目”,则可以使用shell readdate进行排列。例如bind-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"'
克里斯·约翰森

1
@ChrisJohnsen,... 如果我们知道bash为4.1或更高版本,这可能会大大提高效率-产生一个subshel​​l date为每行输出运行一个新的bash副本将严重打击性能!要好得多printf '%(%Y%m%dT%H%M%S)T: %s\n' "$line"(根据需要转义以包含在tmux配置文件中,因此大概将s 加倍%s并转义"s)。
查尔斯·达菲

5

这是一个tmux插件,该插件可以进行日志记录而不会弄乱以下中的键绑定.tmux.conf

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

特征:

  • prefix + P切换窗格日志记录。输出从不需要的ANSI字符中清除!
  • prefix + Alt + P 将完整的窗格历史记录保存到文件

4

浏览完tmux的文档后,我找不到与屏幕的窗口记录等效的任何内容。看来您必须使用Shell函数来完成所需的工作,或者仅使用屏幕。您可以打开调试功能,该功能会同时记录服务器端和客户端的日志,但同时也包含许多与tmux相关的无关日志,因此它并不一定符合您的要求。

您可以使用tmux的剪贴板将缓冲区自动保存到另一个会话,该会话将被设置为接受剪贴板的内容并保存到文件。这似乎有点骇人听闻。


1
那也是我的结论。我决定暂时保留屏幕,这很可惜,除了这种疏忽外,tmux看起来还不错。
Murali Suriar

1

我使用脚本来完成,这是从我的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
屏幕log命令的较差替代,它允许即时登录。但是,如果您使用的是tmux,并且想要使用屏幕的日志记录,则无论如何都必须启动一个新的shell。
Arcege 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.