LINUX.ORG.RU

Автообновление и перезапуск бинарников в линуксе.

 , ,


0

2

Есть софтина, которая может себя скачать и запустить новую версию. Типа как телеграм, который иногда просить нажать на кнопку. После чего он сразу перезапускается на новую версию, что какбэ намекает нам на то, что кнопку эту он рисует только когда новую версию уже скачал и положил рядом.

Только здесь обсуждается серверная софтина, у которой нет GUI и у которой нет необходимости кого-то предупреждать о перезапуске - перезапуститься можно в любой момент, когда новый бинарь подвезли.

Теперь внимание вопрос. Как лучше всего делать такой перезапуск?

  1. Примерно как телега. Если я правильно догадываюсь, то там базовый/основной бинарник не является приложением, а микро-приложением или скриптом, который смотрит в спецпапочку с бинарниками и запускает самый свежий, который уже таки приложение. Для обновления нужно просто скачать новую версию себя и положить рядом со старой, а потом просто сдохнуть с условным кодом «-5» - родительский микробинарник пойдёт снова запускать и поднимет самую свежую версию. Тут даже можно строить приколы с откатами: если после запуска новой версии какие-то условия не были выполнены, то посчитать её багованной, переименовать в .trash и снова уйти в перезапуск, запустив в итоге предыдущую.

  2. Скачать новую, положять рядом. Но не сдыхать, а провести некое освобождение ресурсов, позакрывать сокеты и файлы и просто вызвать execve(). PID останется тот же, но «все структуры» старого приложения заместят новым стартующим. Почему это плохо? Кажется только тем, что (1) проще и понятнее: и pid меняется и не надо париться о том, что ты там недозакрывал из дескрипторов и т.п.



Последнее исправление: lesopilorama (всего исправлений: 1)

В варианте 1 всем рулит провереный, как бы не багованый, простой код. Он ещё и старые файлы удалять может. А в варианте 2 кто удаляет старые файлы, определяет какой самый свежий бинарник и что будет, если новый скаченый бинарник не заработает после execve()?

mky ★★★★★
()

реализация очень сильно зависит от окружения.

Snap, apt, docker, k8s - все эти окружения будут диктовать разные варианты решения.

У нас хорошо работает сходить в репозиторий, проверить доступную версию и предложить обновиться через apt install, который наш софт и дергает.

max_lapshin ★★★★★
()

Есть софтина, которая может себя скачать и запустить новую версию

НАХ такие идеи, при встрече могут и морду набить :-) пятница и два личных выходных улетели на борьбу с подобной хренью...

чужой софт автообновился, а его аффторы традиционно умолчали о большей части изменений, в том числе касающихся взаимодействий

MKuznetsov ★★★★★
()

Обычно дурная идея так делать, админ должен сам принимать решения по обновлению. Исключение, если приложение завязано на веб сервисы третьих лиц, например ютубдл, который завязан на ютуб и старая версия тупо не будет работать.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Обычно дурная идея так делать, админ должен сам принимать решения по обновлению.

Админ и принимает. Не инопланетяне же это решение раскатывают.

lesopilorama
() автор топика
Последнее исправление: lesopilorama (всего исправлений: 1)

позакрывать сокеты

Т.е. пробрасывать открытые сокеты от старой версии к новой тебе не надо. В таком случае я категорически поддерживаю первого комментатора, т.е. за п.1.

Ещё надо упомянуть, что переключать версии можно очень быстро симлинком. Условно: ln -snf new current && current/start.

dimgel ★★★★★
()