summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2011-04-17 19:36:35 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2011-04-17 19:36:35 +0000
commit2c0846569d1eb1e095892312f84c8ece0d8d1bd7 (patch)
tree7034833bc9de91a2ed5449798eca9c383e13fc81 /examples
parentafbbdff581b32569862ef191b4f5ec78a30fc6a7 (diff)
Window content backup script from Victor J Orlikowski.
Diffstat (limited to 'examples')
-rw-r--r--examples/tmux_backup.sh81
1 files changed, 81 insertions, 0 deletions
diff --git a/examples/tmux_backup.sh b/examples/tmux_backup.sh
new file mode 100644
index 00000000..bc0bf370
--- /dev/null
+++ b/examples/tmux_backup.sh
@@ -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