From 086ee5223c55620e97483a0e8ca801eeb17759de Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Wed, 1 Oct 2025 13:42:56 +0200 Subject: [PATCH] Add example tmux daemon --- tmux-daemon.sh | 102 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 tmux-daemon.sh diff --git a/tmux-daemon.sh b/tmux-daemon.sh new file mode 100644 index 0000000..a20c4c7 --- /dev/null +++ b/tmux-daemon.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# tmux-daemonizer.sh +# Idempotent tmux daemon manager with optional per-command workdir + +SESSION="example" +echo "[main] SESSION: $SESSION" + +# Define commands: "workdir:::command" OR just "command" +CMDS=( + "ping google.com" + "ping google.com" + "ping google.com" + "ping google.com" + "ping google.com" + "ping google.com" + "ping google.com" +) +echo "[main] Commands: ${CMDS[*]}" + +# Create session if missing +if ! tmux has-session -t $SESSION 2>/dev/null; then + echo "[main] Creating tmux session: $SESSION" + tmux new-session -d -s $SESSION -n win0 +else + echo "[main] Session $SESSION exists, reusing..." +fi + +win=0 +pane=0 + +for i in "${!CMDS[@]}"; do + entry="${CMDS[$i]}" + echo "[loop:$i] entry: $entry" + if [[ "$entry" == *":::"* ]]; then + workdir="${entry%%:::*}" + echo "[loop:$i] workdir set from entry: $workdir" + cmd="${entry#*:::}" + echo "[loop:$i] cmd set from entry: $cmd" + else + workdir="$PWD" + echo "[loop:$i] workdir set to PWD: $workdir" + cmd="$entry" + echo "[loop:$i] cmd set to entry: $cmd" + fi + echo "[loop:$i] Processing command: $cmd (workdir: $workdir)" + + # Determine target window/pane + win=$((i / 4)) + echo "[loop:$i] win updated: $win" + pane=$((i % 4)) + echo "[loop:$i] pane updated: $pane" + + # Create window if missing + if ! tmux list-windows -t $SESSION | grep -q "^$win:"; then + echo "[loop:$i] Creating window $win" + tmux new-window -t $SESSION:$win -n win$win + fi + + # Get current pane count in window + panes=($(tmux list-panes -t $SESSION:$win -F '#P')) + echo "[loop:$i] panes in window $win: ${panes[*]}" + + # Create missing pane if needed + if [ $pane -ge ${#panes[@]} ]; then + echo "[loop:$i] Splitting pane $((pane-1)) to create pane $pane in window $win" + if [ $pane -eq 1 ]; then + tmux split-window -h -t $SESSION:$win + elif [ $pane -eq 2 ]; then + tmux split-window -v -t $SESSION:$win + elif [ $pane -eq 3 ]; then + tmux split-window -v -t $SESSION:$win.1 + fi + tmux select-layout -t $SESSION:$win tiled >/dev/null + fi + + # Check if command is already running in the pane + running=$(tmux list-panes -t $SESSION:$win -F '#{pane_current_command}' | sed -n "$((pane+1))p") + echo "[loop:$i] running in pane $pane: $running" + if [[ "$running" == "$(basename "$cmd" | awk '{print $1}')" ]]; then + echo "[loop:$i] Command already running in pane $pane, skipping..." + continue + fi + + # Create temporary script to run command in auto-restart loop + tmpfile=$(mktemp) + echo "[loop:$i] tmpfile created: $tmpfile" + cat >"$tmpfile" <