Was würde unter Linux mit einem laufenden Programm passieren, wenn die ausführbare Datei geändert oder gelöscht wurde?

12

Angenommen, es /usr/local/bin/rubywird im Hintergrund ausgeführt, und dann wird rubymit einer anderen Version überschrieben oder sogar gelöscht ruby.

Was passiert mit denen, die Ruby-Prozesse ausführen?

Cheng
quelle

Antworten:

10

Dies hängt davon ab, wie genau die ausführbare Datei aktualisiert wird. Wenn dieselbe Datei geöffnet und Teile davon geändert werden, passieren schlimme Dinge. Wenn es entfernt wird, wird die Datei aus der Verzeichnisstruktur des Dateisystems entfernt, aber nicht wirklich entkoppelt (dh gelöscht), bis der letzte Prozess, der sie geöffnet hat, sie beendet hat. Wenn also die ausführbare Datei entfernt und an ihrer Stelle eine neue mit demselben Namen geschrieben wird, sollte die alte weiterhin einwandfrei funktionieren.

KeithB
quelle
"Wenn dieselbe Datei geöffnet und Teile davon geändert werden" ist nicht gleich "wenn die ausführbare Datei entfernt und an ihrer Stelle eine neue Datei mit demselben Namen geschrieben wird"? Meinten Sie, mv neue Datei zu alter Datei ist schlecht, aber rm alte Datei dann cp neue Datei zu alter Datei Speicherort ist in Ordnung?
Jean
4

Sie werden weitermachen. Vielleicht schrecklich abstürzen, wenn sie versuchen, auf sich selbst zuzugreifen und etwas völlig Falsches zu erhalten. Ich würde es nicht tun, wenn ich nicht müsste :)

Phoshi
quelle
Ja. Ich aktualisiere die Software ständig manuell, während Skripte ausgeführt werden.
John T
1
Für Skripte ist es wichtig, aktuelle Introlter zu haben, die mit dem ursprünglich geöffneten Dateideskriptor arbeiten. In diesem Fall ist es in Ordnung, solange Sie die Datei ersetzen und nicht ändern. Bei Binärdateien funktionieren sie normalerweise auf dem ursprünglich zugeordneten FD, sodass dies kein Problem darstellt (es sei denn, Sie ändern die Dateien). Es kann jedoch Anwendungen geben, die den Dateinamen zur Überprüfung öffnen, und dies kann riskant sein (ich kann jedoch kein negatives Beispiel nennen). Die meisten Linux-Distributionen / Paketmanager arbeiten unter der Annahme, dass das Ersetzen von Binärdateien und Bibliotheken (für eine begrenzte Zeit) in Ordnung ist.
eckes
1

Was passiert mit denen, die Ruby-Prozesse ausführen?

  1. Erstellen Sie eine Kopie von / usr / local / bin / ruby
  2. [Wenn es nicht läuft, starte / usr / local / bin / ruby]
  3. versuchen Sie: rm / usr / local / bin / ruby
  4. und überzeugen Sie sich selbst :)
JohnM2
quelle
1

Nach meinem Verständnis verfügt der Linux-Kernel über eine Komponente namens Loader, die die ausführbare Datei selbst mit dem Image während des Lade- / Verknüpfungsprozesses öffnet. Sobald die Verknüpfung mit Bibliotheken usw. abgeschlossen ist, schließt der Loader die Datei. Somit geschieht dieser Prozess und ist abgeschlossen, wenn der Kernel den Prozess tatsächlich startet.

Ich bin nicht sicher, ob auf die ursprüngliche ausführbare Datei auf der Festplatte verwiesen werden muss, wenn die ausführbare Datei später versucht, externe Bibliotheken zu importieren.

Ich würde sagen, und es ist meine Erfahrung, dass, wenn Sie die ausführbare Datei auf der Festplatte löschen, die im Speicher geladene ausführbare Datei nicht betroffen ist. Wenn die ausführbare Datei durch eine neuere Version ersetzt wird, werden derzeit ausgeführte Dateien nicht "automatisch" aktualisiert, es sei denn, sie werden angehalten und neu gestartet.

Ich hatte Probleme mit einem RAID-Controller, die dazu führten, dass die gesamte Festplatte, auf der das Stammverzeichnis und andere Partitionen gemountet waren, plötzlich so tat, als wäre sie getrennt. Neue Programme konnten nicht geladen werden, aber die im Speicher funktionierten einwandfrei, bis sie Dateien von der Festplatte benötigten.

LawrenceC
quelle
Das klingt nicht sehr effizient. Ich denke, Windows würde es stattdessen dem Speicher zuordnen, sodass die Seiten bei Bedarf geladen werden.
Sashoalm