@UniverseElement

Как сделать автоматическое обновление консольного приложения в Linux на .Net Core?

Разрабатываю автономное консольное приложение для Linux используя .Net Core. Требуется, чтобы приложение само обновлялось через интернет.

Я решил использовать следующую последовательность действий:
- приложение скачивает новую версию,
- обновляет (заменяет) свои файлы,
- перезапускается (используя Process.Start).

Но! Перезапуск приложения натыкается на ошибку "Permission denied" - проблема, которой не было на Windows. Суть в том, что после замены исполняемого файла, с него сбрасывается разрешение на запуск.

Как это обойти?
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
Просто выставить права после установки обновленной версии.
http://docs.go-mono.com/?link=T%3aMono.Unix.Native...
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
leahch
@leahch Куратор тега Linux
3D специалист. Dолго, Dорого, Dерьмово.
Про атрибуты все уже сказали. Но если заливаете в /tmp, то там атрибуты исполнения могут сбрасываться или просто оттуда не запускаться, в зависимости от параметров монтирования /tmp!
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec)
Вот у меня - nosuid (запрещать suid бит), noexec (запрещать исполнение), nodev (запрещать дескрипторы устройств).

У меня процесс обновления происходит в несколько этапов
1) скрипт запуска приложения проверяет линк в /tmp/uploaded
- если есть, запускает приложение по этой ссылке с параметром --uploaded=path-to-new-version и удаляет саму ссылку (!)
- если нет - запускает приложение по стандартному месту
2) приложение проверяет по ключу --uploaded свой функционал и если все хорошо, делает линк на текущую версию на стандартное место приложения, или валится по ошибке.
3) Когда скачалась новая версия, на нее делается ссылка в /tmp/uploaded и приложение гасится
4) приложение перезапускается

В результате, даже если залилось приложение с ошибками, то у меня всегда есть старая версия.
Ответ написан
Комментировать
@pfemidi
Тут могло бы быть краткое описание меня
Устанавливать на заменённый файл атрибут executable.
Ответ написан
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Создайте пакет и разворачивайте по правильному.
https://medium.com/bluekiri/packaging-a-net-core-s...

Или еще проще, просто немного изменив файл.
https://github.com/qmfrederik/dotnet-packaging

Вот тут я описал как
Как собрать лёгкую сборку приложения .NET Core?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы