Wie kann man einen Prozess unter Linux in den Ruhezustand versetzen, indem man seinen Speicher auf der Festplatte speichert und später wiederherstellt?


99

Ist es möglich, einen Prozess unter Linux in den Ruhezustand zu versetzen? Genau wie im Ruhezustand eines Laptops würde ich den gesamten von einem Prozess verwendeten Speicher auf die Festplatte schreiben und den Arbeitsspeicher freigeben. Und später kann ich den Prozess fortsetzen, dh alle Daten aus dem Speicher lesen und wieder in den Arbeitsspeicher stellen, und ich kann meinen Prozess fortsetzen.


8
Interessante Frage: D
dangerstat

Was Sie beschreiben, wird eigentlich oft als "Checkpointing" bezeichnet. Vielleicht haben Sie besseres Glück, wenn Sie mit diesem Begriff suchen.
Tim Post

Es muss sein. Gute Funktion. Ruhezustand vs schließen.
Vitaly Fadeev

Antworten:


54

Ich habe CryoPID gepflegt , ein Programm, das genau das tut, wovon Sie sprechen. Es schreibt den Inhalt des Adressraums, des VDSO, der Dateideskriptorreferenzen und -zustände eines Programms in eine Datei, die später rekonstruiert werden kann. CryoPID wurde gestartet, als es unter Linux selbst keine verwendbaren Hooks gab, und funktionierte vollständig über den Benutzerbereich (tatsächlich funktioniert es immer noch, abhängig von Ihren Einstellungen für Distribution / Kernel / Sicherheit).

Probleme waren (in der Tat) Sockets, ausstehende RT-Signale, zahlreiche X11-Probleme, die Implementierung von glibc caching getpid () unter vielen anderen. Die Randomisierung (insbesondere VDSO) erwies sich für die wenigen von uns, die daran arbeiteten, als unüberwindbar, nachdem Bernard sich davon entfernt hatte. Es hat jedoch Spaß gemacht und wurde zum Thema mehrerer Masterarbeiten.

Wenn Sie nur über ein Programm nachdenken, das seinen laufenden Zustand speichern und direkt in diesem Zustand neu starten kann, ist es weitaus einfacher, diese Informationen einfach aus dem Programm selbst heraus zu speichern, möglicherweise wenn ein Signal bedient wird.


5
Seit Juli 2014 ist CryoPID leider nicht mehr verwaltet und läuft nicht mehr auf aktuellen Kerneln. In der Zwischenzeit werden jedoch neue Projekte geboren (einige Schritte wurden sogar im "Ruhezustand" der TCP-Verbindung unternommen). Ich habe unten eine Antwort mit aktualisierten Informationen angegeben. Hör zu! ;)
dappiu

1
@dappiu Das ist großartig - aber CryoPID war nur ein Beispiel in dieser Antwort, um zu veranschaulichen, wie schwierig es sein kann, und ich schlug vor, dass sie den Status innerhalb des Programms selbst so speichern, dass er leicht wieder aufgenommen werden kann. Eine stagnierende CryoPID macht die Antwort nicht weniger relevant.
Tim Post

Cryopid2 ist seit kurzem aktiv (2013): sourceforge.net/projects/cryopid2
Leopd

31

Ich möchte hier ab 2014 ein Status-Update veröffentlichen.

Die akzeptierte Antwort schlägt CryoPID als Tool zum Ausführen von Checkpoint / Restore vor, aber ich fand, dass das Projekt nicht verwaltet wird und nicht mit den neuesten Kerneln kompiliert werden kann. Jetzt habe ich zwei aktiv verwaltete Projekte gefunden, die die Funktion zum Überprüfen von Anwendungen bereitstellen.

Die erste, die ich vorschlage, weil ich mehr Glück beim Ausführen habe, ist CRIU , die Checkpoint / Restore hauptsächlich im Benutzerbereich ausführt und für deren Funktion die Kerneloption CONFIG_CHECKPOINT_RESTORE aktiviert ist.

Checkpoint / Restore In Userspace oder CRIU (ausgesprochen kree-oo, IPA: / krɪʊ /, russisch: криу) ist ein Software-Tool für das Linux-Betriebssystem. Mit diesem Tool können Sie eine laufende Anwendung (oder einen Teil davon) einfrieren und als Sammlung von Dateien auf eine Festplatte überprüfen. Sie können die Dateien dann verwenden, um die Anwendung ab dem Punkt wiederherzustellen und auszuführen, an dem sie eingefroren wurde. Das CRIU-Projekt zeichnet sich dadurch aus, dass es hauptsächlich im Benutzerbereich implementiert wird.

Letzteres ist DMTCP ; Zitat von ihrer Hauptseite:

DMTCP (Distributed MultiThreaded Checkpointing) ist ein Tool zum transparenten Überprüfen des Status mehrerer gleichzeitiger Anwendungen, einschließlich Multithread- und verteilter Anwendungen. Es arbeitet direkt mit der ausführbaren Datei des Benutzers, ohne Linux-Kernelmodule oder andere Kernelmodifikationen.

Es gibt auch eine schöne Wikipedia-Seite zum Argument: Application_checkpointing


20

In den genannten Antworten geht ctrl-zes in diesem Fall wirklich darum, den Prozess mit einem Signal zu stoppen SIGTSTP. Sie können ein Stoppsignal ausgeben mit kill:

kill -STOP <pid>

Dadurch wird die Ausführung des Prozesses ausgesetzt. Der von ihm verwendete Speicher wird nicht sofort freigegeben, aber da für andere Prozesse Speicher benötigt wird, wird der vom gestoppten Prozess verwendete Speicher schrittweise ausgelagert.

Wenn Sie es wieder aufwecken möchten, verwenden Sie

kill -CONT <pid>

Die komplizierteren Lösungen wie CryoPID werden wirklich nur benötigt, wenn der gestoppte Prozess ein Herunterfahren / Neustarten des Systems überstehen soll - das hört sich nicht so an.


13

Das Problem besteht darin, die Streams - Dateien und Sockets - wiederherzustellen, die das Programm geöffnet hat.

Wenn Ihr gesamtes Betriebssystem in den Ruhezustand wechselt, können die lokalen Dateien und dergleichen offensichtlich wiederhergestellt werden. Netzwerkverbindungen nicht, aber dann ist der Code, der auf das Internet zugreift, in der Regel eher eine Fehlerprüfung und dergleichen und überlebt die Fehlerbedingungen (oder sollte).

Wie würden Sie mit geöffneten Dateien umgehen, wenn Sie den Ruhezustand pro Programm (ohne Anwendungsunterstützung) durchführen würden? Was ist, wenn in der Zwischenzeit ein anderer Prozess auf diese Dateien zugreift? etc?

Es wird schwierig sein, den Status beizubehalten, wenn das Programm nicht geladen ist.

Das einfache Anhalten der Threads und das Auslagern auf die Festplatte hätte fast den gleichen Effekt?

Oder führen Sie das Programm in einer virtuellen Maschine aus und lassen Sie die VM die Suspendierung übernehmen.


12

Die kurze Antwort lautet "Ja, aber nicht immer zuverlässig". Schauen Sie sich CryoPID an:

http://cryopid.berlios.de/

Offene Dateien sind in der Tat das häufigste Problem. CryoPID gibt explizit an:

Geöffnete Dateien und Offsets werden wiederhergestellt. Temporäre Dateien, die nicht verknüpft waren und auf die im Dateisystem nicht zugegriffen werden kann, werden immer im Image gespeichert. Andere Dateien, die im Lebenslauf nicht vorhanden sind, werden noch nicht wiederhergestellt. Die Unterstützung für das Speichern von Dateiinhalten in solchen Situationen ist geplant.

Die gleichen Probleme betreffen auch TCP-Verbindungen, obwohl CryoPID tcpcp für die Wiederaufnahme der Verbindung unterstützt.


3
Nachdem ich auf die Schaltfläche "Senden" geklickt habe, stelle ich fest, dass dies viel wie Spam / Werbung für CryoPID liest. Es ist nicht - ich bin einfach ein zufriedener Benutzer des Dienstprogramms, wirklich.
Ulisses Montenegro



6

Ich habe Cryopid erweitert und ein Paket namens Cryopid2 erstellt, das bei SourceForge erhältlich ist. Dies kann einen Prozess sowohl migrieren als auch in den Ruhezustand versetzen (zusammen mit allen geöffneten Dateien und Sockets - Daten in Sockets / Pipes werden im Ruhezustand in den Prozess gesaugt und beim Neustart des Prozesses in diese zurückgespuckt).

Der Grund, warum ich bei diesem Projekt nicht aktiv war, ist, dass ich kein Kernel-Entwickler bin. Sowohl dieses (als auch das ursprüngliche Kryopid) müssen jemanden an Bord holen, der sie mit den neuesten Kerneln (z. B. Linux 3.x) zum Laufen bringt. .

Die Cryopid-Methode funktioniert - und ist wahrscheinlich die beste Lösung für den allgemeinen Ruhezustand / die Migration von Prozessen unter Linux, auf die ich gestoßen bin.


3

Wie andere angemerkt haben, ist es für das Betriebssystem schwierig, diese Funktionalität bereitzustellen, da in der Anwendung eine Fehlerprüfung erforderlich ist, um fehlerhafte Streams zu verarbeiten.

Nebenbei bemerkt, einige Programmiersprachen und Tools, die virtuelle Maschinen verwenden, unterstützen diese Funktionalität jedoch explizit, z. B. die Programmiersprache Self .


0

Strg-Z erhöht die Wahrscheinlichkeit, dass die Seiten des Prozesses ausgetauscht werden, gibt jedoch die Ressourcen des Prozesses nicht vollständig frei. Das Problem beim vollständigen Freigeben der Ressourcen eines Prozesses besteht darin, dass Dinge wie Dateihandles und Sockets Kernelressourcen sind, die der Prozess verwenden kann, aber nicht weiß, wie er alleine bestehen soll. Strg-Z ist also so gut wie es nur geht.


0

Es gab einige Untersuchungen zu Checkpoint / Restore für Linux in 2.2 und 2.4 Tagen, aber es gelang nie über den Prototyp hinaus. Es ist möglich (mit den in den anderen Antworten beschriebenen Einschränkungen) für bestimmte Werte möglich - ich kann ein Kernelmodul schreiben, um dies zu tun, es ist möglich. Aber für den gemeinsamen Wert von möglich (kann ich es von der Shell auf einer kommerziellen Linux-Distribution aus tun) ist es noch nicht möglich.


0

Dies ist sozusagen das ultimative Ziel eines Cluster-Betriebssystems. Mathew Dillon unternimmt große Anstrengungen, um so etwas in seinem Dragonfly BSD- Projekt umzusetzen .


Ist diese Funktion in Dragonfly BSD vollständig implementiert?
Arjun J Rao

0

Hinzufügen einer weiteren Problemumgehung: Sie können virtualbox verwenden. Führen Sie Ihre Anwendungen in einer normalen virtuellen Maschine aus und speichern Sie einfach den Maschinenzustand, wann immer Sie möchten. Ich weiß, dass dies keine Antwort ist, aber ich dachte, es könnte nützlich sein, wenn es keine wirklichen Optionen gibt.

Wenn Sie Virtualbox aus irgendeinem Grund nicht mögen, sind VMware und Qemu genauso gut.


-2

Es gibt ctrl+zLinux, aber ich bin nicht sicher, ob es die von Ihnen angegebenen Funktionen bietet. Ich vermute, Sie haben diese Frage gestellt, da dies nicht der Fall ist

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.