Если хотите самодельное решение:
1. Создается очередь (список) заданий в базе данных, например.
2. Запускается супервизор (надсмотрщик) смотрит в эту очередь, проверяет какой статус у заданий.
Статусы могут быть такими: "готово", "новое", "в процессе (pid, time)". Можно своих еще добавить.
Супервизор смотрит сколько заданий "в процессе" и проверяет их - если процесс с таким pid отсутствует или висит слишком давно - его можно перезапустить.
Если есть еще свободные слоты для запуска новых воркеров, супервизор запускает их используя
fork, например.
3. Воркер берет новое задание, пишет туда свой pid и время запуска и пытается его выполнить. Если всё получилось - отмечает как "готово" и завершается.
Если самоделка не нужна, используйте
gearman, например.