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.
linux
linux-kernel
hap497
quelle
quelle
Antworten:
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.
quelle
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.
Letzteres ist DMTCP ; Zitat von ihrer Hauptseite:
Es gibt auch eine schöne Wikipedia-Seite zum Argument: Application_checkpointing
quelle
In den genannten Antworten geht
ctrl-z
es in diesem Fall wirklich darum, den Prozess mit einem Signal zu stoppenSIGTSTP
. Sie können ein Stoppsignal ausgeben mitkill
: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
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.
quelle
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.
quelle
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:
Die gleichen Probleme betreffen auch TCP-Verbindungen, obwohl CryoPID tcpcp für die Wiederaufnahme der Verbindung unterstützt.
quelle
Der Linux-Kernel hat jetzt die Checkpoint / Restart-Futures teilweise implementiert: https://ckpt.wiki.kernel.org/ , der Status ist hier .
Einige nützliche Informationen finden Sie im lwn (Linux Weekly Net): http://lwn.net/Articles/375855/ http://lwn.net/Articles/412749/ ......
Die Antwort lautet also "JA".
quelle
Die kurze Antwort lautet "Ja". Sie könnten zunächst einige Ideen untersuchen: Rekonstruierbare ELF-Rekonstruktion aus einem Kernimage ( http://vx.netlux.org/lib/vsc03.html )
quelle
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.
quelle
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 .
quelle
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.
quelle
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.
quelle
Dies ist sozusagen das ultimative Ziel eines Cluster-Betriebssystems. Mathew Dillon unternimmt große Anstrengungen, um so etwas in seinem Dragonfly BSD- Projekt umzusetzen .
quelle
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.
quelle
Es gibt
ctrl+z
Linux, 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 istquelle