Co w Linuksie stałoby się z działającym programem, gdy jego plik wykonywalny został zmodyfikowany lub usunięty?

12

Powiedzmy, że /usr/local/bin/rubydziała w tle, a następnie nadpisujemy rubyinną wersją, a nawet usuwamy ruby.

Co stanie się z tymi, którzy uruchamiają procesy ruby?

Cheng
źródło

Odpowiedzi:

10

Zależy to dokładnie od tego, jak plik wykonywalny jest aktualizowany. Jeśli ten sam plik zostanie otwarty, a jego części zmienione, mogą się zdarzyć złe rzeczy. Jeśli zostanie usunięty, plik zostanie usunięty ze struktury katalogów systemu plików, ale nie zostanie faktycznie odłączony (tj. Usunięty), dopóki ostatni otwarty proces go nie zakończy. Jeśli więc plik wykonywalny zostanie usunięty, a na jego miejscu zostanie zapisana nowa z taką samą nazwą, stary powinien nadal działać poprawnie.

KeithB
źródło
„Jeśli ten sam plik zostanie otwarty, a jego części zmienione” nie jest równy „jeśli plik wykonywalny zostanie usunięty, a na jego miejsce zostanie zapisany nowy plik o tej samej nazwie”? Czy miałeś na myśli, że nowy plik mv do starego pliku jest zły, ale stary plik rm, a następnie cp nowy plik do starego pliku jest w porządku?
Jean
4

Będą kontynuować. Może upaść okropnie, jeśli spróbują uzyskać dostęp do siebie i otrzymają coś zupełnie nie tak. Nie zrobiłbym tego, chyba że musiałbym :)

Phoshi
źródło
Tak. Przez cały czas ręcznie aktualizuję oprogramowanie podczas działania skryptów.
John T
1
W przypadku skryptów ważne jest, aby mieć faktycznych ostatnich intruzów, którzy współpracują z początkowo otwartym deskryptorem pliku. W takim przypadku wszystko jest w porządku, pod warunkiem że plik zostanie zastąpiony i nie zostanie zmieniony. W przypadku plików binarnych zwykle działają one na FD mapowanych celowo, więc nie stanowi to problemu (chyba że zmodyfikujesz pliki). Ale mogą istnieć aplikacje, które otwierają nazwę pliku do kontroli i może to być ryzykowne (nie mogę jednak podać żadnego negatywnego przykładu). Większość dystrybucji / menedżerów pakietów linuksowych działa przy założeniu, że zastępowanie plików binarnych i bibliotek (przez ograniczony czas) jest w porządku.
eckes
1

Co stanie się z tymi, którzy uruchamiają procesy ruby?

  1. zrób kopię / usr / local / bin / ruby
  2. [jeśli nie działa, uruchom / usr / local / bin / ruby]
  3. spróbuj: rm / usr / local / bin / ruby
  4. i przekonaj się sam :)
JohnM2
źródło
1

Rozumiem, że jądro Linuksa ma komponent o nazwie moduł ładujący, który sam otwiera plik wykonywalny, zawierający obraz, podczas procesu ładowania / łączenia, a po zakończeniu łączenia z bibliotekami itp. Moduł ładujący zamyka plik. Tak więc proces ten ma miejsce i jest zakończony do czasu, gdy jądro faktycznie uruchomi proces.

Nie jestem pewien, czy należy odwoływać się do oryginalnego pliku wykonywalnego na dysku, jeśli plik wykonywalny spróbuje później zaimportować biblioteki zewnętrzne.

Powiedziałbym, i z mojego doświadczenia wynika, że ​​jeśli usuniesz plik wykonywalny na dysku, nie będzie to miało wpływu na plik załadowany do pamięci. Podobnie, jeśli plik wykonywalny zostanie zastąpiony nowszymi wersjami, obecnie wykonywane wersje nie są „automatycznie” aktualizowane, chyba że zostaną zatrzymane i ponownie uruchomione.

Miałem problemy z kontrolerem RAID, który spowodował, że cały dysk, na którym zamontowano katalog główny i inne partycje, nagle działał tak, jakby był odłączony. Nie można załadować nowych programów, ale te w pamięci działały poprawnie, dopóki nie potrzebowały plików z dysku.

LawrenceC
źródło
To nie brzmi bardzo wydajnie. Myślę, że zamiast tego system Windows zamapowałby pamięć, aby strony były ładowane na żądanie.
sashoalm