2008-10-10 13 views
11

Ich frage mich, ob es möglich ist, eine "Kern" -Datei zu generieren, kopieren Sie, wenn auf eine andere Maschine und dann die Ausführung der Core-Datei auf diesem Rechner fortsetzen?Können Sie einen C/C++ Prozess einfrieren und auf einem anderen Host fortsetzen?

Ich habe das gcore-Dienstprogramm gesehen, das eine Kerndatei aus einem laufenden Prozess macht. Aber ich glaube nicht, dass gdb die Ausführung basierend auf einer Core-Datei fortsetzen kann.

Gibt es eine Möglichkeit, den Heap/Stack einfach abzulegen und zu einem späteren Zeitpunkt wiederherzustellen?

+1

Was bekam ist mit C/C++ zu tun? – camh

+1

Stimmen Sie mit camh überein, können Sie bitte die C/C++ - Referenz entfernen. Sie können einen Prozess haben, dessen Code vollständig asm ist und die Frage ist gültig. –

Antwort

4

Auf modernen Systemen, nicht aus einer Core-Datei, nein können Sie nicht. Zum Einfrieren und Wiederherstellen eines einzelnen Prozesses unter Linux sind CryoPID und die neuen Kernel-based checkpoint and restart in Arbeit, aber ihre Fähigkeiten sind derzeit ziemlich begrenzt. OpenVZ und andere virtualisierungsähnliche Software können ein gesamtes System einfrieren und wiederherstellen.

-1

Ich glaube nicht, dass dies möglich ist. Möglicherweise möchten Sie jedoch in die Virtualisierungssoftware schauen - z. Xen - die es ermöglichen, ganze Systembilder von einer Maschine auf eine andere einzufrieren und zu verschieben.

2

Dies reicht im Allgemeinen nicht aus, um einen beliebigen Prozess auf einer anderen Maschine fortzusetzen. Zusätzlich zum Heap- und Stack-Status können auch E/A-Handles, zugewiesene Hardwareressourcen usw. geöffnet werden.

Sie haben die Wahl, Ihre Software explizit so zu schreiben, dass sie den Status auf einem Dump-Server ablegen kann signalisieren und später aus dem gedumpten Zustand wieder aufnehmen oder Ihre Software auf einer virtuellen Maschine ausführen und diese auf den alternativen Host migrieren - Xen und Vmware unterstützen sowohl das Einfrieren/Wiederherstellen als auch die Live-Migration.

Das gesagt, CryoPID versucht genau dies zu tun und gelegentlich gelingt.

1

In einigen Fällen kann dies getan werden. Zum Beispiel besteht ein Teil des Emacs-Build-Prozesses darin, alle Lisp-Bibliotheken zu laden und dann das Speicherabbild auf der Platte zum schnellen Laden auszugeben. Einige andere Sprachdolmetscher tun das auch (ich denke hauptsächlich an Lisp- und Scheme-Implementierungen). Sie sind jedoch speziell für diese Art von Nutzung konzipiert, so dass ich nicht weiß, welche speziellen Dinge sie tun müssen, damit dies funktioniert.

Ich denke, das wäre sehr schwer für ein zufälliges Programm zu tun, aber wenn Sie ein Framework geschrieben haben, wo alle Objekte Serialisierung/Deserialisierung unterstützt, können Sie alle Objekte in Ihrem Programm serialisieren, und dann an anderer Stelle und am anderen Ende deserialisieren.

Die Antworten der anderen Leute zur Virtualisierung sind ebenfalls vor Ort.

0

Hängt von der Maschine ab. Es ist sehr machbar in einem sehr kleinen eingebetteten System, zum Beispiel. Ich denke, dass es auch etwas in Beowulf-Clustern und anderen Supercomputer-Apps implementiert ist.

3

Auch das Projekt Condor auschecken. Condor kann das auch mit parallelen Jobs machen. Condor enthält auch Monitore, die Ihren Prozess automatisch migrieren können, wenn z. B. einige ihre Arbeitsstation wieder verwenden. Es ist wirklich für die Nutzung von Ersatzzyklen in vernetzten Umgebungen konzipiert.

0

Es gibt viele Gründe, warum Sie nicht so leicht können, was Sie wollen. Wenn Sie beispielsweise die Core-Datei auf dem anderen Computer wiederherstellen, wie lösen Sie auf, dass die von Ihnen bearbeiteten Dateideskriptoren geöffnet wurden? Was ist mit Sockets, Named Pipes, Semaphoren oder anderen Ressourcen auf Betriebssystemebene? Grundsätzlich können Sie, wenn Ihr System nicht speziell dafür ausgelegt ist, eine Core-Datei ablegen und auf einen anderen Rechner verschieben.

1

Seit Februar 2017 gibt es ein relativ stabiles und ausgereiftes Tool namens CRIU, das auf Updates des Linux-Kernels in Version 3.11 angewiesen ist (wie dies im September 2013 der Fall war, sollten die meisten modernen Distributionen solche enthalten) ihre Kernel-Versionen).

Es kann über aptitude durch einfachen Aufruf sudo apt-get install criu installiert werden.

Instructions on how to use it.