mirror of
https://github.com/tmux/tmux.git
synced 2024-11-08 04:08:49 +00:00
Window content backup script from Victor J Orlikowski.
This commit is contained in:
parent
afbbdff581
commit
2c0846569d
81
examples/tmux_backup.sh
Normal file
81
examples/tmux_backup.sh
Normal file
@ -0,0 +1,81 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# By Victor Orlikowski. Public domain.
|
||||
#
|
||||
# This script maintains snapshots of each pane's
|
||||
# history buffer, for each tmux session you are running.
|
||||
#
|
||||
# It is intended to be run by cron, on whatever interval works
|
||||
# for you.
|
||||
|
||||
# Maximum number of snapshots to keep.
|
||||
max_backups=12
|
||||
# Names of sessions you may wish to exclude from snapshotting,
|
||||
# space separated.
|
||||
ignore_sessions=""
|
||||
# The directory into which you want your snapshots placed.
|
||||
# The default is probably "good enough."
|
||||
backup_dir=~/.tmux_backup/snapshot
|
||||
|
||||
########################################################################
|
||||
|
||||
# Rotate previous backups.
|
||||
i=${max_backups}
|
||||
while [[ ${i} != 0 ]] ; do
|
||||
if [ -d ${backup_dir}.${i} ] ; then
|
||||
if [[ ${i} = ${max_backups} ]] ; then
|
||||
rm -r ${backup_dir}.${i}
|
||||
else
|
||||
mv ${backup_dir}.${i} ${backup_dir}.$((${i}+1))
|
||||
fi
|
||||
fi
|
||||
i=$((${i}-1))
|
||||
done
|
||||
|
||||
if [ -d ${backup_dir} ] ; then
|
||||
mv ${backup_dir} ${backup_dir}.1
|
||||
fi
|
||||
|
||||
## Dump hardcopy from all windows in all available tmux sessions.
|
||||
unset TMUX
|
||||
for session in $(tmux list-sessions | cut -d' ' -f1 | sed -e 's/:$//') ; do
|
||||
for ignore_session in ${ignore_sessions} ; do
|
||||
if [ ${session} = ${ignore_session} ] ; then
|
||||
continue 2
|
||||
fi
|
||||
done
|
||||
|
||||
# Session name can contain the colon character (":").
|
||||
# This can screw up addressing of windows within tmux, since
|
||||
# target windows are specified as target-session:target-window.
|
||||
#
|
||||
# We use uuidgen to create a "safe" temporary session name,
|
||||
# which we then use to create a "detached" session that "links"
|
||||
# to the "real" session that we want to back up.
|
||||
tmpsession=$(uuidgen)
|
||||
tmux new-session -d -s "$tmpsession" -t "$session"
|
||||
HISTSIZE=$(tmux show-options -g -t "$tmpsession" | grep "history-limit" | awk '{print $2}')
|
||||
for win in $(tmux list-windows -t "$tmpsession" | grep -v "^\s" | cut -d' ' -f1 | sed -e 's/:$//'); do
|
||||
session_dir=$(echo "$session" | sed -e 's/ /_/g' | sed -e 's%/%|%g')
|
||||
win_spec="$tmpsession":"$win"
|
||||
|
||||
if [ ! -d ${backup_dir}/${session_dir}/${win} ] ; then
|
||||
mkdir -p ${backup_dir}/${session_dir}/${win}
|
||||
fi
|
||||
|
||||
for pane in $(tmux list-panes -t "$win_spec" | cut -d' ' -f1 | sed -e 's/:$//'); do
|
||||
pane_path=${backup_dir}/${session_dir}/${win}/${pane}
|
||||
pane_spec="$win_spec"."$pane"
|
||||
|
||||
tmux capture-pane -t "$pane_spec" -S -${HISTSIZE}
|
||||
tmux save-buffer ${pane_path}
|
||||
|
||||
if [ ! -s ${pane_path} ] ; then
|
||||
sleep 1
|
||||
rm ${pane_path}
|
||||
fi
|
||||
done
|
||||
done
|
||||
tmux kill-session -t "$tmpsession"
|
||||
|
||||
done
|
Loading…
Reference in New Issue
Block a user