How can I write all the scrollback in a tmux session to a file?
capture-pane
can grab the current screen, but not the entire scrollback.
11 Answers 11
For those looking for a simple answer:
- Use prefix + :, then type in
capture-pane -S -3000
+ Return. (Replace-3000
with however many lines you'd like to save, or with-
for all lines.) This copies those lines into a buffer. - Then, to save the buffer to a file, just use prefix + : again, and type in
save-buffer filename.txt
+ return. (by default it'll save the file in ~/)
(By default Prefix is Ctrl+B.)
-
50
save-buffer filename.txt
seems to save the file in/
, not inpwd
(current directory). Instead, I provided an absolute file path and it worked like a charmMohamedEzz– MohamedEzz2016年12月08日 09:54:27 +00:00Commented Dec 8, 2016 at 9:54 -
27and don't forget that MINUS in front of the <<amount-of-buffer-lines-you-want-to-save>>Yordan Georgiev– Yordan Georgiev2016年12月23日 12:46:27 +00:00Commented Dec 23, 2016 at 12:46
-
14+n>1 After logging in to upvote, it would appear this is at least the second time this answer has been helpful to me. XDL0j1k– L0j1k2019年03月28日 03:01:24 +00:00Commented Mar 28, 2019 at 3:01
-
25Anything you can do via prefix+:, you can also do as a command arg to the
tmux
binary. So, anytime an answerer gives you a hint likecapture-pane
, searchman tmux
for it. Then you will find that-p
prints to stdout. Then you can deduce that the simplest solution istmux capture-pane -pS -1000000 > transcript.txt
. I've taught you to fish. Use this for all things tmux.Bruno Bronosky– Bruno Bronosky2019年04月26日 16:03:59 +00:00Commented Apr 26, 2019 at 16:03 -
7@MohamedEzz For me,
save-buffer filename.txt
saved to home directory.Jean Paul– Jean Paul2019年05月20日 14:16:25 +00:00Commented May 20, 2019 at 14:16
With tmux 1.5, the capture-pane
command accepts -S
and -E
to specify the start and end lines of the capture; negative values can be used to specify lines from the history. Once you have the data in a buffer, you can save it with save-buffer
.
Here is an example binding (suitable for .tmux.conf
) that wraps it all up with a prompt for the filename:
bind-key P command-prompt -p 'save history to filename:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'
This captures (up to) 32768 lines of history plus the currently displayed lines. Starting with tmux 1.6, you can use numbers down to INT_MIN if your pane has a history that is deeper than 32Ki lines (usually up to 2Gi lines). Starting in tmux 2.0, you can use capture-pane -S -
to mean "start at the beginning of history" (i.e. no large, hard-coded negative number).
Note: The number of lines in the saved file will not always be equal to the pane’s history limit plus its height.
When a pane’s history buffer is full, tmux discards the oldest 10% of the lines instead of discarding just one line. This means a pane’s effective history depth will sometimes be as low as 90% of its configured limit.
-
Thanks for the answer... But my version of tmux doesn't accept
-S
tocapture-pane
(it appears to be 1.3-2, although that's fromdpkg
, as I can't figure out how to get tmux to show me a version number...)David Wolever– David Wolever2011年12月12日 05:40:59 +00:00Commented Dec 12, 2011 at 5:40 -
1You probably are running tmux 1.3; you can probably use
tmux server-info | head -1
to see your version.tmux -V
works in tmux* 1.4 and later.Chris Johnsen– Chris Johnsen2011年12月12日 08:03:03 +00:00Commented Dec 12, 2011 at 8:03 -
1And if you are already in your tmux window and don't want to restart just do a
[PrefixKey] :
to get to the tmux command line, and then paste the whole line, then you just do a[Prefix] P
it is capital P and you are good to go.Ali– Ali2013年12月17日 21:43:11 +00:00Commented Dec 17, 2013 at 21:43 -
1Add
-e
tocapture-pane
(i.e.,capture-pane -e
) to include colors in Tmux 1.8 and up.William Denniss– William Denniss2017年05月25日 23:00:14 +00:00Commented May 25, 2017 at 23:00 -
2Is it possible to have the file name of the tmux buffer file generated automatically rather than prompted for? So everything you run the shortcut it would save to another file, for example with the current time in the filename.user779159– user7791592017年09月16日 12:44:20 +00:00Commented Sep 16, 2017 at 12:44
If you want something you can run from the command line (instead of using your tmux prefix keys), try running:
tmux capture-pane -pS -
If you run it and it seems to not do anything, that's because it's outputting exactly what was just on your screen, so it looks the same.
Of course, you can also pipe it into a file:
tmux capture-pane -pS - > file.out
See the tmux
man page and search for capture-pane
for more things you can do (like capture escape sequences in case you want to preserve color, or specify whether you want multiple visual lines to be joined when they don't contain a new line)
-
1The
-p
argument outputs to stdout instead of a tmux buffer.palswim– palswim2019年12月01日 06:24:06 +00:00Commented Dec 1, 2019 at 6:24 -
4If you are aren't in a local console this won't work so what I've tried is the following: 1) add a horizontal pane below 2) in the local shell,
tmux capture-pane -t {top} -pS -1000 > ~/tmp.out
Adverbly– Adverbly2020年07月27日 13:57:17 +00:00Commented Jul 27, 2020 at 13:57 -
5On my tmux (2.6-3ubuntu0.2), you can use
-S-
to capture all the available history in the pain:tmux capture-pane -p -S- > /tmp/output.txt
. First-hand source (I think): man7.org/linux/man-pages/man1/tmux.1.html#COMMANDS, "-S and -E specify the starting and ending line numbers [...] ‘-’ to -S is the start of the history"Eric Cousineau– Eric Cousineau2021年03月14日 19:21:28 +00:00Commented Mar 14, 2021 at 19:21 -
5Ah, also useful: Use
-J
so that wordwrapping in your buffer is removed when dumped to a file, caveat is training spaces, sosed
can help. Full cmd:tmux capture-pane -p -J -S- | sed -E 's# +$##g' > /tmp/output.txt
Eric Cousineau– Eric Cousineau2021年03月24日 21:42:50 +00:00Commented Mar 24, 2021 at 21:42 -
1@EricCousineau do you understand why
-J
adds trailing spaces? That is really a shame, I wish I could avoidsed
ing all of them out in case there are actual trailing spaces in the output.Ciro Santilli OurBigBook.com– Ciro Santilli OurBigBook.com2022年04月25日 11:08:56 +00:00Commented Apr 25, 2022 at 11:08
This depends on the value of history-limit
that you have set in your .tmux.conf
- the default is 2000; if you wish to capture more, you will need to explicitly set the number of lines.
To capture the entire scrollback, enter copy mode, select the entire scrollback, and yank it into the buffer, then paste it into your file.
How you accomplish this will depend on the mode-keys
option you prefer, vi or emacs. man tmux
has a helpful table describing the respective keys.
I have the following in my .tmux.conf
to simplify this:
unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection
The process for capturing the full scrollback is then:
PrefixEsc : to enter copy mode
v : to begin visual selection (assuming you are already at the bottom of the screen)
gg : to capture everything in the scrollback
y : to yank it into the buffer
Prefixc : open another tmux window
vim scrollback.txt
i : enter insert mode in vim
Prefixp : paste into file
There is also an answer here describing how to copy the buffer to a temporary file using xsel
that might be useful.
-
4This is problematic at best ... pasting into insert mode in Vim has all kinds of problems, e.g. when you have automatic indentation enabled. I never got this to work to my satisfaction.Konrad Rudolph– Konrad Rudolph2015年01月21日 16:19:42 +00:00Commented Jan 21, 2015 at 16:19
-
23If you use
:set paste
in vim, vim will ignore adding automatic indentations or any insert-based keybindings.tlunter– tlunter2015年02月04日 21:18:42 +00:00Commented Feb 4, 2015 at 21:18 -
Can this be done with default key bindings?daveloyall– daveloyall2015年11月05日 17:00:15 +00:00Commented Nov 5, 2015 at 17:00
-
@daveloyall Of course, just don't use the keybind options I included from my
.tmux.conf
...jasonwryan– jasonwryan2015年11月05日 17:14:43 +00:00Commented Nov 5, 2015 at 17:14 -
@KonradRudolph the way I got around that was by instead using
cat << EOF >> file
, and then pasting the tmux buffer, and then terminating it with a line containing onlyEOF
. Worked like a charm.Braden Best– Braden Best2017年05月19日 18:15:19 +00:00Commented May 19, 2017 at 18:15
I had standard key bindings which appeared to be a bit different than in @jasonwryan's answer and didn't change anything in config.
Below is recipe that worked for me. Maybe you will find it useful if you don't want to make any changes in tmux config and just want to quickly copy some of the scrollback.
Prefix == Ctrl+b in my tmux (tmux 1.6, debian 7).
- Enter select mode: Prefix + [.
- Start selection: Space.
- Highlight necessary text using vim navigation (for instance, use arrow keys or press gg to reach beginning of output history).
- Actually copy in internal clipboard using Enter. You will be exited from copy mode.
- Open any file using vim (probably on new tmux tab) and paste content you copied before using Prefix + ].
- Then you may do cat of that file or use output how you need.
-
man tmux helped me to sort out that my tmux was in emacs mode, so none of the key-bindings above worked. man tmux, again, helped me sort out what to use. But the biggest mistake that I made was that the host that I saved the contents from was not the host that I was running tmux from, so I kept looking for the saved file on the wrong host ...Cognitiaclaeves– Cognitiaclaeves2017年08月04日 01:29:14 +00:00Commented Aug 4, 2017 at 1:29
Here's a tmux plugin that enables this:
https://github.com/tmux-plugins/tmux-logging
After you install it, save the entire scrollback with prefix + alt-shift-p
.
Write all the scrollback history from a tmux pane to a file:
tmux capture-pane -pS - > file
where ‘-’ to -S is the start of the history
, as the manual says.
For all panes in the session, you can loop through all the panes with tmux list-panes -s ...
.
To specify a target pane:
tmux capture-pane -t :WINDOW.PANE -pS - > file
Use -t
to specify target pane. The format is SESSION:WINDOW.PANE
. For example, -t :1.2
means current tmux session, window 1, pane 2.
To identify the pane, use prefix + q, which prints the ID for each pane for the current window.
How can I write all the scrollback in a tmux session to a file?
I use this in my ~/.tmux.conf, and now when I exit my running shell, pane output is saved to unique log file:
set -g remain-on-exit
set-hook pane-died 'capture-pane -S - -E - ; save-buffer "$HOME/logs/tmux/tmux-saved.#{host_short}-#{session_id}:#{window_id}:#{pane_id}-#{pane_pid}-#{client_activity}.log"; delete-buffer; kill-pane'
This is actually very easy.
Enter the command mode by press prefix key
then :
.
Then do capture-pane -S -<line number you want to dump>
Then save-buffer <filepath>
That file contains all the scrollback output. You should delete the buffer afterwards for safety reason.
Dump to a file and automatically open the file in vim
This is sweet:
bind-key v 'capture-pane' \; \
capture-pane -S - \; \
save-buffer /tmp/tmux \; \
delete-buffer \; \
send-keys Escape 'ddivim /tmp/tmux' Enter
This solution supposes that your shell is in vi mode, so that:
- Escape goes into normal mode
dd
clears any existing commandi
goes into insert mode- then we run
vim /tmp/tmux
Tested in tmux 3.0.
Newline insertion on terminal wrap issue
One problem with this is that it inserts literal newlines on any line that would have been broken up due to terminal wrapping if output lines are longer than you terminal width. And we usually don't want that.
I tried to fix this with -J
as mentioned here but that caused another problem, it started adding trailing space characters to each line.
Eric Cousineau proposes a workaround for that with sed
, but I'd really rather avoid this as it would remove actual newlines emitted by the commands, which I want to be there.
Kind of the inverse of this was asked at: https://github.com/tmux/tmux/issues/422 Add capture-pane option to only preserve trailing spaces. Maybe the space thins is a fundamental terminal limitation?
-
3+1 Wonderful answer, but writing the scrollback to a file in
/tmp
looks like a bad idea since others get the permission to read it! Additionally, in case one is going to use this just to navigate the scrollback with full Vim powers and don't actually want to keep it in a file polluting the filesystem, then one could immediately delete the file after Vim gets its contents in a buffer. E.g. this is what I do:bind v capture-pane -S - \; save-buffer ~/.x \; delete-buffer \; new-window 'vim "set buftype=nofile" +"!rm ~/.x" ~/.x +'
.Quasímodo– Quasímodo2021年04月29日 20:05:40 +00:00Commented Apr 29, 2021 at 20:05 -
This is a decent solution but doesn't work well. I got
$ divim /tmp/tmux -bash: divim: command not found.
looks like sending keys ddi has issues. tmux version. 3.3aJustin Lin– Justin Lin2022年08月16日 16:15:34 +00:00Commented Aug 16, 2022 at 16:15 -
@JustinLin is your terminal in vim mode? unix.stackexchange.com/questions/4870/…Ciro Santilli OurBigBook.com– Ciro Santilli OurBigBook.com2022年08月16日 17:48:04 +00:00Commented Aug 16, 2022 at 17:48
-
@CiroSantilliПутлерКапут六四事 I have tmux.conf
set-window-option -g mode-keys vi
. guess that what you mean by vim modeJustin Lin– Justin Lin2022年08月16日 18:21:01 +00:00Commented Aug 16, 2022 at 18:21 -
@JustinLin no, I mean in
.inputrc
: unix.stackexchange.com/questions/4870/…Ciro Santilli OurBigBook.com– Ciro Santilli OurBigBook.com2022年08月17日 05:04:51 +00:00Commented Aug 17, 2022 at 5:04
I tried the answers from here quite extensively, and ran into a repeated problem that not all scroll back was recorded due to its size, wether it just became too big or I forgot to increase the limit on a new machine. I ended up saving the log to a file on the fly:
tmux pipe-pane -o 'cat >>~/tmux.log'
and then
tmux pipe-pane
to stop logging. That circumvents all limits and also works even if machine crashes and you are unable to save scroll back manually.
If you want to lower HDD use you can use "buffer" utility. This command will write each time log increases by 16kb:
tmux pipe-pane -o 'buffer -s 1k -m 16k > ~/tmux.log'