Depende de quão robusto você quer que isso seja. Uma solução simplista que executa o "próximo" programa em uma lista circular pode ser assim:
#! /usr/bin/env bash
programs=(program1 program2 program3 program4 program5)
state=$HOME/.${0#*/}_state
if [ -f "$state" ]; then
read idx <"$state"
if expr "$idx" : '[0-9][0-9]*$' >/dev/null; then
let idx=(idx+1)%${#programs[@]}
else
let idx=0
fi
else
let idx=0
fi
printf '%d\n' "$idx" >"$state" || exit 1
exec "${programs[$idx]}" "$@"
Se você quer algo mais robusto, você precisa bloquear e provavelmente manter o estado em um banco de dados.