Допустим, /usr/local/bin/ruby
работает в фоновом режиме, а затем мы перезаписываем ruby
с другой версией, или даже удаляем ruby
.
Что будет с этими запущенными процессами ruby?
Это зависит от того, как именно исполняемый файл обновляется. Если открыть тот же файл и изменить его части, произойдут плохие вещи. Если он удаляется, файл удаляется из структуры каталогов файловой системы, но на самом деле не связывается (то есть удаляется) до тех пор, пока последний процесс, открывший его, не выполнит его, не завершится. Таким образом, если исполняемый файл удален и на его месте написан новый с тем же именем, старый должен продолжать работать нормально.
Они будут продолжать идти. Может быть, ужасно потерпеть крах, если они попытаются получить доступ к себе и получить что-то совершенно не так. Я бы не стал этого делать, если бы мне не пришлось :)
источник
источник
Насколько я понимаю, в ядре Linux есть компонент, называемый загрузчиком, который открывает сам исполняемый файл, содержащий изображение, во время процесса загрузки / компоновки, а после завершения ссылок на библиотеки и т. Д. Загрузчик закрывает файл. Таким образом, этот процесс происходит и завершается к тому моменту, когда ядро фактически запускает процесс.
Я не уверен, нужно ли ссылаться на исходный исполняемый файл на диске, если позже исполняемый файл пытается импортировать внешние библиотеки.
Я бы сказал, и по моему опыту, если вы удалите исполняемый файл на диске, исполняемый файл, загруженный в память, не будет затронут. Аналогично, если исполняемый файл заменяется более новыми версиями, исполняемые в настоящее время не обновляются «автоматически», если они не остановлены и не перезапущены.
У меня были проблемы с RAID-контроллером, из-за которого весь диск, на котором был смонтирован корневой каталог и другие разделы, внезапно начал действовать так, как если бы он был отключен. Не удалось загрузить новые программы, но те, которые в памяти, работали нормально, пока им не понадобились файлы с диска.
источник