
Angenommen, ich habe einen Prozess, der lange Berechnungen durchführt (z. B. seit Tagen läuft) und eine Festplatte als temporären Speicher für Zwischenergebnisse verwendet (z. B. gemountet unter /mnt
und ich möchte sie /dev/sda1
durch ersetzen /dev/sdb1
). Wie kann ich diese Festplatte durch eine andere ersetzen, ohne den Prozess zu beenden und ihn zu sehr zu stören?
Das ist eine allgemeine Frage, ich denke nicht an ein bestimmtes Programm. Nehmen wir an, wir verwenden eine aktuelle Linux-Version.
Antwort1
Wenn der Prozess ein Verzeichnis zum Erstellen und Löschen temporärer Dateien verwendet, können Sie wahrscheinlich versuchen, ihn mit kill -STOP $pid
einem Befehl zu stoppen und in /proc/$pid/fd nach geöffneten Dateideskriptoren zu suchen.
Wenn keines geöffnet ist, können Sie den Einbindungsort bedenkenlos ändern, die Dateien kopieren und mit der Arbeit fortfahren kill -CONT $pid
.
Wenn noch einige Dateien geöffnet sind oder der Prozess sie nicht schließt, können Sie versuchen, Dateideskriptoren mit GDB zu migrieren. Ich habe das manuell versucht und es hat funktioniert, aber ich habe ein Skript gefunden, das das für Sie erledigen kann:http://ingvar.blog.redpill-linpro.com/2010/07/10/changing-a-process-file-descriptor-on-the-fly/
Seien Sie vorsichtig, wenn der Prozess über das Netzwerk kommuniziert. Wenn Sie ihn stoppen, kann es zu einer Zeitüberschreitung der Verbindung kommen. Tun Sie dies also so schnell wie möglich (testen Sie die Befehlssequenz vorher am Dummy-Prozess und führen Sie sie als Batch aus).
Obwohl ich denke, dass es funktionieren würde, werde ich liebernicht empfohlenSie können es in einer Produktionsumgebung tun.
BEARBEITEN: Sie können geöffnete Netzwerk-Sockets auch in /proc/$pid/fd sehen, sodass Sie feststellen können, ob der Prozess das Netzwerk verwendet oder nicht.
Antwort2
Dies hängt vollständig vom Verhalten Ihres Prozesses bei Verwendung seines temporären Speichers ab.
Wenn Ihr Prozess eine Datei auf geöffnet hält /mnt
, können Sie das Gerät nicht ersetzen, ohne dass der Prozess höchstwahrscheinlich auf undefinierte Weise fehlschlägt, selbst wenn Sie es schaffen, das Gerät zwangsweise zu trennen. Prozesse erwarten im Allgemeinen nicht, dass Geräte verschwinden, auf denen sie offene Dateien haben.
Wenn Ihr Prozess Dateien öffnet, in sie schreibt und sie dann schließt /mnt
, können Sie ihn möglicherweise stoppen, aushängen, neu einhängen /mnt
und neu starten. Dies hängt davon ab, ob Sie den Prozess stoppen können, während er nicht verwendet /mnt
. Sie könnten also
$ kill -STOP pid
$ lsof -p pid | grep /mnt
... then, if it has nothing open on /mnt ...
$ sudo umount /mnt
$ sudo mount /dev/sdb1 /mnt
$ kill -CONT pid
Dies funktioniert nicht unbedingt, selbst wenn Sie den Prozess beenden, ohne dass Dateien geöffnet sind /mnt
, da Sie möglicherweise eine Logik unterbrochen haben, die auf /mnt
Nichtänderung beruht; etwas wie
- Überprüfen, ob
/mnt/wibble
vorhanden - Das stimmt! Machen wir uns bereit, es zu öffnen und daraus zu lesen
- ...der Vorgang wird gestoppt und ein anderes Gerät wird eingebunden
/mnt
... - ...Prozess wird neu gestartet...
- Oh nein!
/mnt/wibble
lässt sich nicht öffnen! - Stirb schrecklich
Antwort3
Jedes Programm, dessen Berechnungen mehrere Tage dauern, sollte so konzipiert sein, dass es in regelmäßigen Abständen ausreichende Status auf die Festplatte überträgt. Wenn ein Neustart des Prozesses bedeutet, dass Sie eine Stunde Verarbeitungszeit verlieren, ist das vielleicht in Ordnung, wenn Sie jedoch mehr verlieren, würde ich das Programm als schlecht konzipiert bezeichnen.
Allerdings kann es auch andere Szenarien geben, in denen Sie einen Prozess länger am Leben erhalten und eine Festplatte unter ihm austauschen möchten. In solchen Situationen sollten Sie das Dateisystem vom physischen Medium entkoppeln.
Mögliche Optionen sind:
- Software-Raid verwenden
- Andere virtuelle Blockgeräteschicht verwenden (vielleicht ist LVM geeignet)
- Verwenden Sie ein Dateisystem, das selbst mehrere zugrunde liegende Geräte verwenden kann