Powiedzmy, że /usr/local/bin/ruby
działa w tle, a następnie nadpisujemy ruby
inną wersją, a nawet usuwamy ruby
.
Co stanie się z tymi, którzy uruchamiają procesy ruby?
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.
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 :)
źródło
źródło
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.
źródło