Pull to refresh

Comments 56

Наверное, можно было бы вынести функционал в модули, а основной файл заставить подгружать новые или перегружать изменённые модули: изменения ведь обычно локальные. Перезапуск тогда не понадобится совсем.
Теоретически - можно. Практически же в этом изначально не было необходимости, позже переделывать структуру программы было бы сложно, долго и неэффективно.
UFO landed and left these words here
Мой способ учитывает все вероятности.
А зачем вообще нужно обновлять клиента ?
Чтобы исправлять найденные ошибки.
Это не просто "клиент-сервер", там всё гораздо сложнее. Несколько серверов БД, плюс интеграция с смс-центром для отсылки оповещений, плюс приём USSD-запросов от инженеров, плюс ещё до хрена всего в одной куче, взаимодействующего друг с другом. В общем, под клиентом подразумевается сложный программный комплекс. Даже, в некотором роде, программно-аппаратный.
С точки зрения безопасности довольно опасное решение, особенно если программа запускается с повышенными привилегиями.
В общем случае - возможно.
В этом случае - вопрос безопасности не стоит. К тому же, доступ на запись к каталогу обновлений есть только у тех, кому он нужен.
Я не могу представить себе способа, которым злоумышленник мог бы навредить работе в этом конкретном случае.
Согласен, но безопасные решения лучше использовать на всех архитектурных уровнях, тогда сбои в некоторых из них не приведут к фатальным последствиям.
Используемые файлы хоть и нельзя заменить, зато можно переименовать. Свою утилиту обновляю переименованием старого файла и копированием нового в тот же каталог. Старый после освобождения удаляется вручную. Программа работает в терминале, старая версия нормально работает, у вновь подключившихся запускается новая версия.
Заем вручную? Идея с переименованием самая правильная. Старые переименовывается в какой-нибдуь _tmp001.$$$ а программа при старте косить все _tmp???.$$$ которые удастся удалить. Именно так я всегда и делал. Очень красиво, просто и безопасно. Причём программа обновляла сама себя, что решало проблемму с правами - она согздавала исполняемый файл с правами равными своим. Потом переименовывала себя. Потом переименовывала новый файл. А при следующем перезапуске удаляла весь мусор.
я просто ни разу не переименовывал себя
Замечательно переименовывается. Более того можно переместить файл в пределах того же тома (только функциями WinAPI). Т.е. создаётся папмочку Tmp - переименовываете и переносите себя туда. А на своё место пишете новый файл. Папочку чистите при запуске. Так очень многие программые себя обновляют.
Вы конечно извините меня, я не самизнаетекто, но это бл**ять, такую ху***йню писать в блог, да ещё и выносить на главную... бред. Гениальное решение, блин, я смеюсь. Поиск по маске...
а вот зря минусуете. я на эту совершенно пустую заметку время потратил. подумал, "о, интересно" - открыл страничку, приготовился внимательно читать, изучать, а мне тут лапшу на уши вешают.
в общем, извиняться автору не надо, уже наср... но задуматься, стоит ли писать всякую банальщину на хабр, надо. детский сад.
болеете графоманией - заводите свои блоги, как я.
Решение оказалось действительно простым. Настолько простым, что кажется до него может додуматься даже школьник. И ведь действительно может! А умудренный опытом программист возможно начнет возводить сложную систему там, где этого совсем не нужно.
Я понимаю ваше негодование, вы ожидали увидеть готовый рецепт, рабочий код. Но ведь так даже лучше: все обошлось без кода.
а я на ваш пустой комментарий время потратил :)
я вот чево подумал, если приложению не требуется работать под оч. большими нагрузками можно было бы даже незаметно для пользователя это сделать. Т.е.:
1. Качаем новый файлег.
2. Запускаем.
3. Согласовываем действия старой и новой версии.
4. Переключаеми ввод/вывод на новую версию.
5. Закрываем старую программу.
6. Прописываем в скрипт запуска путь к новой версии

Вот как то так ...
это и есть тот самый "сложный способ" :)
в дополнение к авторскому способу можно встроить в новые версии программ систему оповещений: автор собирает новую версию программы, а всем старым посылает сообщение "программа обновилась. перезапусти программу", которое показывается пользователю
поставьте на файловый сервер *nix +samba там можно удалять и заменять открытый файл, виндовс программисты умудряются найти проблему на пустом месте :)
Хе. Зато юникс-админы любят предлагать решения, которые доставляют больше забот, чем сами проблемы =)
А вы сами пробовали использовать юникс-решения аналогичные виндовым?
угу, и программа вылетит с ошибкой при попытке обращения к ресурсам.
> Неплановый запуск программы – вещь очень нежелательная. Перезапуск занимает пару минут, но за это время может проскочить важное событие, которое не будет отслежено.

1) а чем он отличается от планового? почему за время планового перезапуска важное событие не может быть пропущено?
2) это значит что, любой segfault или unhandled exception = потенциально потерянные важные события/данные? не страшно программировать в такой среде? :) а BSoD? а отказы оборудования? сколько "важных событий" вы уже пропустили и просто об этом не знаете?

по-моему вы просто решали не ту проблему. ну и, как уже было сказано, файлы можно просто переименовывать.
>а чем он отличается от планового? почему за время планового перезапуска важное событие не может быть пропущено?
Придётся объяснять специфику.
Программа обеспечивает мониторинг состояния базовых станций (это, естественно, дублируемый мониторинг) и автоматизацию регистраций проникновений на них. На каждом отдельном рабочем месте, грубо говоря, мониторится свой регион+свой радиокоммандер. От инженера, работающего на станции, в любой момент может прийти какое-то оповещение, на которое программа должна среагировать. Например, он может через USSD запросить список аварий на станции. Или, что важно, может сам послать сообщение о каком-то событии.
Если своевременной реакции не будет - инженер будет звонить оператору, это потерянное время и для него, и для оператора.
Плановый перезапуск совершается тогда, когда инженеров на базовых станций региона нет. Обычно это раннее утро.

>это значит что, любой segfault или unhandled exception = потенциально потерянные важные события/данные? не страшно программировать в такой среде? :) а BSoD? а отказы оборудования? сколько "важных событий" вы уже пропустили и просто об этом не знаете?
Нет, как видите, не значит. Во-первых, как уже сказано, мониторинг дублируется. Во-вторых, потеря информации невозможна - возможно только увеличение времени реакции на них.
Новые версии мониторинга обкатываются очень серьёзно. В бетах, конечно, ошибки допускались, но с проверенными версиями за два года проблем не было абсолютно никаких (тьху-тьху).
А СЭСов я не видел уже лет пять. Тем более - на работе. Даже если что-то и случится - это нештатная ситуация, которую техподдержка исправляет очень быстро в любое время суток.
а зачем вы придираетесь? почему вас волнуют чужие страхи?
может быть, у вас проблемы в семье? не в порядке здоровье? затянувшаяся депрессия и вы вымещаете её на других?
вы хотите поговорить об этом?
:)
шутка.
не стоит из мухи раздувать слона. небольшую локальную проблему чаще всего проще решить так же локально, чем пересматривать весь проект целиком и менять всё глобально :)
Используем Click Once в составе Visual Studio 2005. Предлагает обновиться при запуске программы (постоянно работающие программы обычно запускаются при загрузке системы), пользователю только надо нажать Ok. В принципе быстро и эффективно, для тех, кто пишет на VS.
Минусы:
-пользователю все таки надо что-то нажимать, елси доступна новая версия.
-бывают глюки после крупных апгрейдов, программа не стартует (лечится полной переустановкой)
-какая-то муть с сертификатами (по умолчанию создается на год, как сделать больше пока не ясно) но я не копался толком)
-без перезапуска программы не обновиться (если программа работает в круглосуточном режиме)
-только для win
Плюсы:
-установка с веба (правда только с ie+NET 2.0).
-все версии сборок хранятся на сервере.
-при отсутствии доступа к серверу запускается последняя рабочая версия.
-ну и все плюсы администрирования в связи с автоматическим обновлением.
Да, click once хорош, однако когда необходимо обновлять системную утилиту этот вариант не подходит.
Мне приходилось разрабатывать net-службу мониторинга изменений конфигурации спец-программы. Я решил вопрос созданием сервиса на сервере обновлений (HTTP) который выдавал последнюю версию и ссылку на нее. После скачивания версии (msi файл) происходила деинсталляция установленной версии, а затем инсталляция новой. Перезапуск был нежелателен, но на другой велосипед времени не было.
Не разумней ли подобные системы проектировать под вебинтерфейс?
скорее всего речь идет о каком-то специфическом софте, которым никто не доволен, включая начальтсво, но поскольку все более-менее работает, а данег жалко, его продолжают использовать и мучаться.
Ситуация прямо противоположная. То, что вы описали, было раньше. Новая система написана с учётом всей специфики, работает как часы, и нравится абсолютно всем. Для веб можно было бы спроектировать только интерфейсную часть мониторинга, которая, по сути, никому не нужна, а для автоматизации всё равно пришлось бы сочинять какие-то нативные решения.
А почему нельзя было разместить для всех ярлык (.lnk) и при выходе новой версии программы изменять его?
Ярлыки на каждом рабочем месте (~10) менять геморно, даже если автоматизировать этот процесс. Хотя, как вариант, можно было вместо обновлялки сделать ещё один ярлык, который и править вручную =). Вот вам и ещё более простое решение =)
Я и имел в виду — общий ярлык, расположенный по общедоступному сетевому пути.
Ну, если бы мне этот вариант пришёл в голову - я бы так и сделал. Но, видимо, чем опытнее прогер, тем более сложные решения ему в голову приходят.
Зато теперь есть автоматизация и нет геморроя с редактированием ярлыка.
о да, преписать ярлык - это такой геморрой..
столько проблем изза изначально неправильно спроектированной системы
прога клиента не должна слушать сообщения, она их должна запрашивать у надежного хранилища и помечать обработанные оператором
и тогда не возникнет проблем с обновлением клиента
Прочтите выше про специфику. Спроектировано всё удачно. При проектировании рассматривались все варианты, годы работы показали, что при проектировании ошибок не было.
я про то, что перезапуск программы по той или иной причине приводит к потере информации
это неправильно по определнию. пока прога не работает данные теряться не должны!
стало быть приложение должно слать серверу квитанцию о получении сообщения и только после этого удалять сообщение из очереди
на примере СПС КонсультантПлюс: один .exe и обновляемые *.res файлы, при запуске *.exe и обнаружении нового *.res автоматически используется он, а не устаревший
Знакомая ситуация, раньше писал для бухгалтерии ПО. И когда приходилось обновлять появлялись те же трудности, что и у автора. Я пошел немного другим путем. Все машины были настроены на один ярлык на сервере. Когда я выкладывал обновление, то менял путь в свойствах ярлыка. И все кто запускали программу, запускали уже новую версию. Но автор пошел дальше, он автоматизировал процесс.
Замечу, что когда обновления были связаны с изменением структуры базы, то все равно приходиться делать по старинке.
Шо за кустарщина? :)

Мой компьютер > Управление > Общие папки > Открытые файлы > Правой кнопкой на файле, "Отключить"

Или в командной строке:
net file

И потом:
net file /close

И никаких программ-загрузчиков :)

В случае, если программа запускается локально, а не с сетевой шары, тоже есть замечательнейший способ подмены файлов без программ-загрузчиков. Файл кладется рядом со случайным именем, пусть "tmp_12345.exe", рядом создается файл tmp_12345.bat и запускается. Содержимое (за синтаксис ВАТ-файлов не ручаюсь):

---- begin tmp_12345.bat ----
:copy
copy tmp_12345.exe MyLockedFile.exe /Y

if errorlevel goto :copy

del tmp_12345.exe
del tmp_12345.bat
---- end tmp_12345.bat ----
а что произойдёт, если запущенная программа обратится к своим ресурсам в удалённом файле?
Это по поводу 1-го варианта? Пользовались таким долго, и никаких проблем никогда не возникало.
Наверное, все-таки исполняемый файл с сетевого ресурса грузится в память целиком. Можно поставить эксперимент, собственно :)
Думаю, что зависит от программы и, может быть, системного окружения (памяти стало не хватать и ресурсы были выгружены).
Когда я ещё программировал под Windows, я иногда вручную загружал ресурсы (например, графику или звук) — может быть, это как раз тот случай?
Точно не знаю, как реагирует запущенная из сети программа на удаление своего выполняемого файла, но много раз видел, как запущенная с компактдиска программа рушилась при попытке закрыть её, если диска не было в дисководе
А куда у Вас ведет work dir приложения? Ведь в случае запуска с сети он ведет на сеть же? И разделяется сразу несколькими пользователями, что не есть хорошо, если туда что-то писать (какие-нибудь логи и т.п.) или хранить настройки в файлах. Можно, конечно, temp dir пользоваться, который у каждого пользователя будет локальным, но это тоже не очень удачное решение.
Всё логируется в оракловую базу данных. Настройки - в реестре, т.е. независимы для каждого пользователя.
Может уже было, но читать комменты неохота…

Как не упустить «важное событие»:

Разделить программу на две части: одна только логгит события (обновляется редко), другая их просматривает и делает всё остальное (обновляется чаще). После перезапуска вторая прога нагоняет события из упущенного прошлого.

Не всегда конечно сработает, но… Есть ещё языки с динамической подгрузкой кода. В дотнете развита концепция версий одного и того же «модуля» — кажется их даже можно подменять на лету (в некоторых языках точно можно).
В случае появления нового билда, хорошо бы уведомить тех кто держит запущенными старые версии..
Угу, вручную, через корпоративный джаббер =)
Автор безусловно молодец.
Единственное что могу по-рекомендовать - иногда поглядывать за действиями ненавистной всеми мегакорпорацией Майкрософт. Они эту задачу уже давно решили через ClickOnce. Разумеется не дословно, но общий подход такой.
Я не понял, в чем именно проблема. Если ты разработчик программы, то тебя никто не ограничивает в средствах реализации:
1. Веб-интерфейс. Здесь все понятно? Нет залоченного файла, хотя эта проблема решается достаточно легко сторонними программами.
2. Разнесение запускаемого интерфейса и функциональных, подгружаемых в процессе работы модулей.
3. А вообще непонятно решение собрать в одну кучу пользовательский интерфейс и систему снятия статистики. Держи 2 сервера, на которых в качестве сервиса крутится программа для сбора. В случае остановки сервиса для обновления на главном сервере, второй сервис следит за пополнением БД. Тогда обновление серверной и клиентской части происходят раздельно и абсолютно безболезненно. А если клиентская часть будет реализована через веб-интерфейс или терминальные решения, то система будет более гибкой и масштабируемой.
Возникнут вопросы по реализации - милости прошу в личку.
Sign up to leave a comment.

Articles