 eda6f5931d
			
		
	
	
		eda6f5931d
		
	
	
	
	
		
			
			We have to use SOCK_SEQPACKET instead of SOCK_STREAM for client/server communication, because UDS does things with control messages that tmux does not expect. Change-Id: I3edb1875d61fb976cf6485c650f4fd4b82fa354c
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/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
 |