В Linux, что будет с работающей программой, если ее исполняемый файл был изменен или удален?


12

Допустим, /usr/local/bin/rubyработает в фоновом режиме, а затем мы перезаписываем rubyс другой версией, или даже удаляем ruby.

Что будет с этими запущенными процессами ruby?

Ответы:


10

Это зависит от того, как именно исполняемый файл обновляется. Если открыть тот же файл и изменить его части, произойдут плохие вещи. Если он удаляется, файл удаляется из структуры каталогов файловой системы, но на самом деле не связывается (то есть удаляется) до тех пор, пока последний процесс, открывший его, не выполнит его, не завершится. Таким образом, если исполняемый файл удален и на его месте написан новый с тем же именем, старый должен продолжать работать нормально.


«Если один и тот же файл открыт и его части изменены» не равно «если удаляется исполняемый файл и на его место записывается новый файл с тем же именем» ?? Вы имели в виду, что новый файл mv для старого файла плох, но старый файл rm, а затем новый файл cp для старого файла в порядке?
Жан

4

Они будут продолжать идти. Может быть, ужасно потерпеть крах, если они попытаются получить доступ к себе и получить что-то совершенно не так. Я бы не стал этого делать, если бы мне не пришлось :)


Ага. Я вручную обновляю программное обеспечение все время, пока выполняются сценарии.
Джон Т

1
Для сценариев важно иметь актуальных последних intrpreters, которые работают с первоначально открытым файловым дескриптором. В этом случае это нормально, пока вы заменяете файл, а не изменяете его. Для двоичных файлов, как правило, они работают на изначально отображенном FD, так что это не проблема (если вы не измените файлы). Но могут быть приложения, которые открывают имя файла для проверки, и это может быть рискованно (однако я не могу привести ни одного отрицательного примера). Большинство дистрибутивов / менеджеров пакетов Linux работают в предположении, что замена двоичных файлов и библиотек (на ограниченное время) - это нормально.
eckes

1

Что будет с этими запущенными процессами ruby?

  1. сделайте копию / usr / local / bin / ruby
  2. [если он не работает, запустите / usr / local / bin / ruby]
  3. попробуйте: rm / usr / local / bin / ruby
  4. и убедитесь сами :)

1

Насколько я понимаю, в ядре Linux есть компонент, называемый загрузчиком, который открывает сам исполняемый файл, содержащий изображение, во время процесса загрузки / компоновки, а после завершения ссылок на библиотеки и т. Д. Загрузчик закрывает файл. Таким образом, этот процесс происходит и завершается к тому моменту, когда ядро ​​фактически запускает процесс.

Я не уверен, нужно ли ссылаться на исходный исполняемый файл на диске, если позже исполняемый файл пытается импортировать внешние библиотеки.

Я бы сказал, и по моему опыту, если вы удалите исполняемый файл на диске, исполняемый файл, загруженный в память, не будет затронут. Аналогично, если исполняемый файл заменяется более новыми версиями, исполняемые в настоящее время не обновляются «автоматически», если они не остановлены и не перезапущены.

У меня были проблемы с RAID-контроллером, из-за которого весь диск, на котором был смонтирован корневой каталог и другие разделы, внезапно начал действовать так, как если бы он был отключен. Не удалось загрузить новые программы, но те, которые в памяти, работали нормально, пока им не понадобились файлы с диска.


Это звучит не очень эффективно. Я думаю, что вместо этого Windows отобразит карту памяти, поэтому страницы загружаются по требованию.
Сашоальм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.