Информация об изменениях

Сообщение Re[4]: Почему после обновлений не надо перезагружаться? от 06.07.2017 10:59

Изменено 07.07.2017 8:48 netch80

Re[4]: Почему после обновлений не надо перезагружаться?
Здравствуйте, aik, Вы писали:

N>>Проблема возникает, когда, например, одновременно меняется код бинарника и формат lib-файла, используемого этим бинарником. Вот тогда можно ждать разнообразных цветных искр от того, что недоостановленный старый бинарь лезет за файлом, который в новом формате.

aik>Поясни механику. Динамический линкер при старте обычного процесса грузит либы, и дальше их можно unlink и запись по новой — на работающем процессе это скажется только если процесс долбанутый и выгружает-загружает библиотеки по ходу работы. Или есть другой сценарий?

Я понял, что тебя смущает. lib-файл — не обязательно библиотека кода, это любое, что используется процессом. Лучше было бы сказать libdata (стиль BSD — они разделяют /usr/lib, /usr/libdata, /usr/libexec).
Если процесс может этот файл переоткрывать в процессе работы, подмена на ходу приведёт к тому, что процесс старый, а файлы данных нового формата. И опаньки.

Но, кстати, к собственно библиотекам (в виде .so и т.п.) это тоже относится, и почему так сразу и "долбанутый"? Вполне может быть ситуация, что требуется какой-то плагин, а потом перестал требоваться, и ему dlclose() до новой потребности.

N>>А дальше — легче потребовать перезагрузки для исключения проблемных ситуаций в принципе, чем вычислять, кого затронет, а кого — нет.

aik>Ну а по-моему это потому, что удалить открытую dll нельзя (ну, раньше нельзя было) — нет линуксового unlink, отсюда и заходы с перезагрузкой.

Я такие вещи именно под виндой "лечил" так — если не разрешает удалять или перемещать файл, перемещаем целый каталог. Это почему-то работало — в частности, против всякой adware дряни, которая цеплялась на старте системы.
Когда перезагрузился и она неактивна — тогда можно и удалять всё из этих временных каталогов.
Re[4]: Почему после обновлений не надо перезагружаться?
Здравствуйте, aik, Вы писали:

N>>Проблема возникает, когда, например, одновременно меняется код бинарника и формат lib-файла, используемого этим бинарником. Вот тогда можно ждать разнообразных цветных искр от того, что недоостановленный старый бинарь лезет за файлом, который в новом формате.

aik>Поясни механику. Динамический линкер при старте обычного процесса грузит либы, и дальше их можно unlink и запись по новой — на работающем процессе это скажется только если процесс долбанутый и выгружает-загружает библиотеки по ходу работы. Или есть другой сценарий?

Я понял, что тебя смущает. lib-файл — не обязательно библиотека кода, это любое, что используется процессом и входит в поставку пакета. Лучше было бы сказать libdata (стиль BSD — они разделяют /usr/lib, /usr/libdata, /usr/libexec). У Linux принято пихать в /usr/lib и /usr/share всё, что нужно пакету, поэтому я так и назвал.

Если процесс может этот файл переоткрывать в процессе работы, подмена на ходу приведёт к тому, что процесс старый, а файлы данных нового формата. И опаньки.

Но, кстати, к собственно библиотекам (в виде .so и т.п.) это тоже относится, и почему так сразу и "долбанутый"? Вполне может быть ситуация, что требуется какой-то плагин, а потом перестал требоваться, и ему dlclose() до новой потребности.

N>>А дальше — легче потребовать перезагрузки для исключения проблемных ситуаций в принципе, чем вычислять, кого затронет, а кого — нет.

aik>Ну а по-моему это потому, что удалить открытую dll нельзя (ну, раньше нельзя было) — нет линуксового unlink, отсюда и заходы с перезагрузкой.

Я такие вещи именно под виндой "лечил" так — если не разрешает удалять или перемещать файл, перемещаем целый каталог. Это почему-то работало — в частности, против всякой adware дряни, которая цеплялась на старте системы.
Когда перезагрузился и она неактивна — тогда можно и удалять всё из этих временных каталогов.