Самый простой способ — по крону запускаете «надсмотрщика» (supervisor). Надсмотрщик сохраняет свой PID в файл, мемкеш или БД и если видит, что другой надсмотрщик уже запущен — молча умирает.
Надсмотрщик должен быть предельно прост, чтобы не падать. Обнаружить падение надсмотрщика можно по тому признаку, что файл с PID есть, а процесса с таким PID нет — значит предыдущий надсмотрщик внезапно завершился. Это можно зафиксировать в лог.
Если надсмотрщик запустился и других надсмотрщиков нет, он берет задания и запускает одного или несколько скриптов-рабочих (worker), каждому раздает по заданию. Если кто-то из рабов успешно завершился, помечаем задачу как выполненную, если умер — он логгирует это и запускает нового, если с N попыток задача так и не сделана, она помечается как невыполнимая и больше не выполняется.