Можно написать скрипт на shell (sh, csh, bash). Он запускает программу; дожидается её завершения (тут вообще ничего делать не нужно, это штатное поведение); проверяет код завершения процесса и логи; и принимает решение - перезапустить программу или нет.
Есть программы, которые "заныривают в background" - процесс делает fork, родитель завершается, чилдрёнок работает. Это как раз против того, чтобы запустивший программу скрипт дожидался завершения.
Как правило, так делают всякие программы-демоны типа SendMail, Apache, Squid и прочие. Но такие программы оставляют файл типа /var/run/программа.pid (путь м.б. другой; имя файла бывает иное), в котором в первой строке записан id процесса (если программа запускает несколько копий - то id главного процесса). Далее очевидно - надо дожидаться завершения этого процесса. И я не уверен, что можно получить код завершения - надо смотреть документацию.
Если файл /var/run/программа.pid не создан - значит, процесс вообще не запустился; ну или запустился и успел сдохнуть. Хотя если процессу прислать "kill -9" - то он сдохнет, но /var/run/программа.pid останется" но записанный там id процесса, скорее всего, будет свободен. Это тоже надо учесть.