Безопасно ли удалять общую библиотеку во время выполнения программ, зависящих от нее?

Вероятно, ffprobe— это то, что вам нужно. Он поставляется с пакетомffmpeg(в debian и производным ), также вы можете загрузить и скомпилировать с дополнительными функциями из здесь .

Просто передайте файл в качестве аргумента, например

ffprobe miFile.mp3

и вы получите информацию о файле.

Для получения дополнительной информации вы можете проверить справочную страницу ffprobeи, если вам интересно, также справочную страницу ffmpeg. Обе программы очень мощные и могут многое

Проверьте эту ссылку для примеровffprobe

0
20.08.2021, 12:10
1 ответ

I thought so, because if the program was running, then all the necessary data from the library was loaded into memory

Исполняемые данные считываются только тогда, когда это необходимо , в противном случае вы будете ждать целую вечность для тяжелых приложений, таких как, например. Google Chrome для запуска (его двоичный файл в настоящее время 179 134 080байт ). Кроме того, WinRAR в Windows позволяет создавать самораспаковывающиеся -архивы размером до 2^64 - 1. Вы никогда не сможете извлечь их, если ядру необходимо загрузить весь код в ОЗУ перед его запуском.

If the library is already in memory, why is the program crushed because of a change to the library on disk?

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

Даже когда библиотека была выполнена, она читалась и кэшировалась, и ее все еще можно кэшировать, когда ядру не хватает памяти.

Сбой, потому что вы фактически заменили файл, и ядро ​​пытается найти функции, которые вы просите выполнить. Эти функции становятся мусором после перезаписи файла, поэтому приложение аварийно завершает работу.

And if the library is not in memory, then why can it be deleted from the disk and the program will continue execution? Where does it read data from the library from?

Архитектура Unix, используемая в ядре Linux, позволяет удалять открытые файлы. Поскольку число дескрипторов этого файла больше нуля, такой файл не будет технически удален до тех пор, пока не будет закрыт последний дескриптор.

Is it safe to remove a shared lib while programs which depends on it is executing?

Да, прекрасно. Перезапись такой библиотеки небезопасна. Замена снова безопасна, потому что ядро ​​будет использовать старую (удаленную )библиотеку. Таким образом вы можете заменить почти все библиотеки без перезагрузки системы. Только когда вы замените их, вам придется перезапустить все приложения, которые их используют.

Наконец, несколько лет назад было исправлено ядро ​​Linux, позволяющее заменять себя на лету:https://ostechnix.com/5-kernel-live-patching-tools-that-will-help-to-run-linux-servers-without-reboots/

0
20.08.2021, 12:46

Теги

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