mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Window content backup script from Victor J Orlikowski.
This commit is contained in:
		
							
								
								
									
										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
 | 
				
			||||||
		Reference in New Issue
	
	Block a user