А что конкретно вам не понятно?
При запуске прога делает HTTPS GET-запрос по предварительно зашитому в ней урлу. Если из заголовков следует, что эта версия проге не нужна, то можно оборвать соединение и не получать сам файл обновления. Того же можно добиться и двумя запросами: первый HEAD, а второй, при необходимости, GET.
Если скачана новая версия, нужно проверить её контрольную сумму и, очень желательно, подпись. Но если у вас https, то с подписью возиться не обязательно.
Далее нужно запустить в отдельном процессе шелл-скрипт, который дождётся завершения старой проги и после этого запустит новую.
На этом старая прога завершает свою работу.
Как только скрипт увидит, что старая закрылась, сразу подменяет файл и запускает новую.
Если что-то пошло не так, то можно записать сообщение о проблеме в файл и повторно запущенная старая прога, увидев это сообщение не будет пытаться обновиться снова на ту версию, поскольку "что-то пошло не так", а будет ждать новую.
Вариантов тут много. Наверно есть готовые библиотеки, которые это заточены делать. Из следовало бы создать, если бы их не существовало, а это значит, что они скорее всего уже есть и в изобилии. Ищите готовые решения.