Store contents of every tmux pane using a shell script.

Shell script

Use the following shell script to capture the data. Inspect it to learn how to target each tmux session, window, and pane.

#!/bin/bash
# Store the contents of every tmux pane
#

# Get timestamp
timestamp="$(date +%s)"

# Get home dir
tmux_home_directory="$HOME"

# Define output directory
output_directory="${tmux_home_directory}/.tmux/logs/$(hostname -s)-${timestamp}"

# Create output directory
mkdir -p ${output_directory}

# Display output directory
echo "Output directory: ${output_directory}"

# Display date
date | tee "${output_directory}/date"

# Iterate over tmux sessions
tmux_sessions="$(tmux list-sessions -F "#{session_id}")"
for tmux_session in $tmux_sessions; do

  tmux_session_name="$(tmux display-message -t "${tmux_session}" -p "#{session_name}")"
  echo "Session: ${tmux_session_name} (${tmux_session})" | tee -a "${output_directory}/overview"

  # Iterate over tmux windows
  tmux_windows="$(tmux list-windows -F "#{window_id}" -t "${tmux_session}")"
  for tmux_window in $tmux_windows; do
    tmux_window_name="$(tmux display-message -t "${tmux_session}:${tmux_window}" -p "#{window_name}")"
    echo "  Window: ${tmux_window_name} (${tmux_window})" | tee -a "${output_directory}/overview"

    # Iterate over tmux panes
    tmux_panes="$(tmux list-panes -F "#{pane_id}" -t "${tmux_session}:${tmux_window}")"
    for tmux_pane in $tmux_panes; do
      tmux_pane_name="$(tmux display-message -c "${tmux_session}:${tmux_window}" -t "${tmux_pane}" -p "#{pane_title}")"
      echo "    Pane: ${tmux_pane_name} (${tmux_pane})" | tee -a "${output_directory}/overview"

      tmux capture-pane -t "${tmux_pane}" -b temp-capture-buffer-${timestamp} -S -
      tmux save-buffer -b temp-capture-buffer-${timestamp} "${output_directory}/${tmux_session}-${tmux_window}-${tmux_pane}.log"
      tmux delete-buffer -b capture-buffer-${timestamp}
    done
  done
done

Usage

Execute the shell script.

$ tmux.sh
Output directory: /home/milosz/.tmux/logs/milosz-XPS-13-9343-1562702696
Tue Jul  9 22:04:56 CEST 2019
Session: 2 ($2)
  Window: bash (@3)
    Pane: milosz-XPS-13-9343 (%11)
    Pane: milosz-XPS-13-9343 (%12)
Session: 3 ($3)
  Window: bash (@4)
    Pane: milosz-XPS-13-9343 (%14)
    Pane: milosz-XPS-13-9343 (%17)
    Pane: mc [milosz@milosz-XPS-13-9343]:~/Projekty/blog/assets (%15)
  Window: bash (@5)
    Pane: milosz-XPS-13-9343 (%16)
Session: 4 ($4)
  Window: bash (@7)
    Pane: milosz-XPS-13-9343 (%20)
Session: 8 ($8)
  Window: htop (@12)
    Pane: milosz-XPS-13-9343 (%29)
  Window: bash (@13)
    Pane: milosz-XPS-13-9343 (%30)
Session: home ($0)
  Window: vim (@0)
    Pane: milosz-XPS-13-9343 (%2)
    Pane: milosz-XPS-13-9343 (%6)
    Pane: milosz-XPS-13-9343 (%19)
    Pane: milosz-XPS-13-9343 (%8)
  Window: bash (@1)
    Pane: milosz-XPS-13-9343 (%7)
  Window: bash (@6)
    Pane: milosz-XPS-13-9343 (%18)
Session: work ($1)
  Window: bash (@8)
    Pane: milosz-XPS-13-9343 (%24)

Inspect created directory.

$ ll /home/milosz/.tmux/logs/milosz-XPS-13-9343-1562702696
total 988
-rw-rw-r-- 1 milosz milosz  41121 Jul  9 22:04 '$0-@0-%19.log'
-rw-rw-r-- 1 milosz milosz  47072 Jul  9 22:04 '$0-@0-%2.log'
-rw-rw-r-- 1 milosz milosz  42727 Jul  9 22:04 '$0-@0-%6.log'
-rw-rw-r-- 1 milosz milosz  38352 Jul  9 22:04 '$0-@0-%8.log'
-rw-rw-r-- 1 milosz milosz  10063 Jul  9 22:04 '$0-@1-%7.log'
-rw-rw-r-- 1 milosz milosz  86257 Jul  9 22:04 '$0-@6-%18.log'
-rw-rw-r-- 1 milosz milosz   4813 Jul  9 22:04 '$1-@8-%24.log'
-rw-rw-r-- 1 milosz milosz  81861 Jul  9 22:04 '$2-@3-%11.log'
-rw-rw-r-- 1 milosz milosz 144384 Jul  9 22:04 '$2-@3-%12.log'
-rw-rw-r-- 1 milosz milosz 114458 Jul  9 22:04 '$3-@4-%14.log'
-rw-rw-r-- 1 milosz milosz 141742 Jul  9 22:04 '$3-@4-%15.log'
-rw-rw-r-- 1 milosz milosz 175881 Jul  9 22:04 '$3-@4-%17.log'
-rw-rw-r-- 1 milosz milosz    142 Jul  9 22:04 '$3-@5-%16.log'
-rw-rw-r-- 1 milosz milosz     95 Jul  9 22:04 '$4-@7-%20.log'
-rw-rw-r-- 1 milosz milosz  17789 Jul  9 22:04 '$8-@12-%29.log'
-rw-rw-r-- 1 milosz milosz  17066 Jul  9 22:04 '$8-@13-%30.log'
-rw-rw-r-- 1 milosz milosz     30 Jul  9 22:04  date
-rw-rw-r-- 1 milosz milosz    894 Jul  9 22:04  overview

Inspect date.

$ cat /home/milosz/.tmux/logs/milosz-XPS-13-9343-1562702696/date
Tue Jul  9 22:04:56 CEST 2019

Inspect tmux overview.

$ cat /home/milosz/.tmux/logs/milosz-XPS-13-9343-1562702696/overview
Session: 2 ($2)
  Window: bash (@3)
    Pane: milosz-XPS-13-9343 (%11)
    Pane: milosz-XPS-13-9343 (%12)
Session: 3 ($3)
  Window: bash (@4)
    Pane: milosz-XPS-13-9343 (%14)
    Pane: milosz-XPS-13-9343 (%17)
    Pane: mc [milosz@milosz-XPS-13-9343]:~/Projekty/blog/assets (%15)
  Window: bash (@5)
    Pane: milosz-XPS-13-9343 (%16)
Session: 4 ($4)
  Window: bash (@7)
    Pane: milosz-XPS-13-9343 (%20)
Session: 8 ($8)
  Window: htop (@12)
    Pane: milosz-XPS-13-9343 (%29)
  Window: bash (@13)
    Pane: milosz-XPS-13-9343 (%30)
Session: home ($0)
  Window: vim (@0)
    Pane: milosz-XPS-13-9343 (%2)
    Pane: milosz-XPS-13-9343 (%6)
    Pane: milosz-XPS-13-9343 (%19)
    Pane: milosz-XPS-13-9343 (%8)
  Window: bash (@1)
    Pane: milosz-XPS-13-9343 (%7)
  Window: bash (@6)
    Pane: milosz-XPS-13-9343 (%18)
Session: work ($1)
  Window: bash (@8)
    Pane: milosz-XPS-13-9343 (%24)

Inspect specific pane contents.

$ tail /home/milosz/.tmux/logs/milosz-XPS-13-9343-1562702696/\$2-@3-%1*
==> /home/milosz/.tmux/logs/milosz-XPS-13-9343-1562702696/$2-@3-%11.log <==
"unconfined") (using servicehelper)
Jul  3 00:02:23 milosz-XPS-13-9343 dbus-daemon[1230]: [system] Successfully activated service 'org.kde.powerdevil.backlighthelper'
Jul  3 00:03:19 milosz-XPS-13-9343 dbus-daemon[1230]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.11' (uid=0 pid=1476 comm="/usr/sbin/NetworkManager --no-daemon " label="unconfined")
Jul  3 00:03:19 milosz-XPS-13-9343 systemd[1]: Starting Network Manager Script Dispatcher Service...
Jul  3 00:03:19 milosz-XPS-13-9343 dbus-daemon[1230]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'

==> /home/milosz/.tmux/logs/milosz-XPS-13-9343-1562702696/$2-@3-%12.log <==
19567 -------->      Process 19566 is writing to it using its 1
19567 -------->      I am reading from it
19567 --------> File descriptor 1 points to pipe:[23699554]
19567 -------->      I am writing to it
19567 -------->      Process 19568 is reading it using its fd 0
19568 ----------> CMD: grep system
19568 ----------> File descriptor 0 points to pipe:[23699554]
19568 ---------->      Process 19567 is writing to it using its 1
19568 ---------->      I am reading from it

This is really cool!

ko-fi