Що в Linux буде, що станеться із запущеною програмою, коли її виконавчий файл буде змінено чи видалено?


12

Скажімо, /usr/local/bin/rubyвін працює у фоновому режимі, а потім перезаписуємо rubyіншу версію або навіть видаляємо ruby.

Що буде з тими запущеними рубіновими процесами?

Відповіді:


10

Це залежить від того, як саме оновлено виконуваний файл. Якщо відкрити той самий файл і змінити його частини, трапляться погані речі. Якщо він видалений, файл видаляється зі структури каталогів файлової системи, але насправді не від’єднується (тобто видаляється) до тих пір, поки не завершиться останній процес, відкритий ним. Отже, якщо виконуваний файл буде видалений, а на його місці написано нове з тим самим ім'ям, старий повинен продовжувати працювати нормально.


"Якщо один і той же файл відкритий, а частини його змінені" не дорівнює ", якщо виконуваний файл буде видалений, а на його місці записаний новий з тим самим іменем" ?? Ви мали на увазі mv новий файл для старого файлу поганий, але rm старий файл, тоді cp новий файл для старого файлу, це нормально
Жан

4

Вони продовжуватимуть. Можливо, жахливо зірветься, якщо вони спробують отримати доступ до себе і отримають щось зовсім не так. Я б не робив цього, якби не довелося :)


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

1
Для скриптів важливо мати фактичні останні інтрудтери, які працюють з початково відкритим дескриптором файлів. У цьому випадку це добре, доки ви замінюєте файл і не змінюєте його. Для бінарних файлів вони, як правило, працюють на FD, що не відображається, і це не проблема (якщо ви не змінюєте файли). Але можуть бути програми, які відкривають ім'я файлу для перевірки, і це може бути ризиковано (я не можу навести жодного негативного прикладу). Більшість дистрибутивів Linux / менеджери пакунків працюють за умови, що замінити бінарні файли та бібліотеки (на обмежений час) добре.
eckes

1

Що буде з тими запущеними рубіновими процесами?

  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.