reset-elapsed() { (( last_cmd_at = SECONDS )) } ping-timer() { kill -USR1 "$reaper_pid" } slay-reaper() { kill -KILL "$reaper_pid" } { trap reset-elapsed USR1 last_cmd_at=0 while sleep 1; do (( elapsed = SECONDS - last_cmd_at )) if (( elapsed > 600 )); then kill -KILL "$$" exit fi done } & reaper_pid=$! PROMPT_COMMAND+=(ping-timer) trap slay-reaper EXIT