Früher habe ich CryoPID gewartet, ein Programm, das genau das tut, wovon Sie sprechen. Es schreibt den Inhalt des Adressraums eines Programms, VDSO, Dateideskriptorreferenzen und Zustände in eine Datei, die später rekonstruiert werden kann. CryoPID startete, als es in Linux selbst keine verwendbaren Hooks gab, und funktionierte vollständig aus dem Userspace (tatsächlich funktioniert es immer noch, abhängig von Ihrer Distribution/Kernel/Sicherheitseinstellungen).
Probleme waren (in der Tat) Sockets, ausstehende RT-Signale, zahlreiche X11-Probleme, die Glibc-Caching-getpid()-Implementierung unter vielen anderen. Randomisierung (insbesondere VDSO) erwies sich für die wenigen von uns, die daran arbeiteten, als unüberwindbar, nachdem Bernard sich davon verabschiedet 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 viel ... viel ... einfacher, diese Informationen einfach aus dem Programm selbst heraus zu speichern, vielleicht wenn ein Signal gewartet wird.
Ich möchte hier ein Status-Update von 2014 veröffentlichen.
Die akzeptierte Antwort schlägt CryoPID als Tool zum Ausführen von Checkpoint/Restore vor, aber ich fand das Projekt nicht gepflegt und konnte nicht mit neueren Kerneln kompiliert werden. Jetzt habe ich zwei aktiv verwaltete Projekte gefunden, die die Anwendungs-Checkpointing-Funktion bereitstellen.
Das erste, das ich vorschlage, weil ich mehr Glück beim Ausführen habe, ist CRIU, das Checkpoint/Restore hauptsächlich im Userspace durchführt und erfordert, dass die Kernel-Option CONFIG_CHECKPOINT_RESTORE aktiviert ist, um zu funktionieren.
Checkpoint/Restore In Userspace oder CRIU (ausgesprochen kree-oo, IPA:/krɪʊ/, Russisch:криу) ist ein Softwaretool 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 setzen. Sie können dann die Dateien verwenden, um die Anwendung von dem Punkt aus wiederherzustellen und auszuführen, an dem sie eingefroren wurde. Die Besonderheit des CRIU-Projekts besteht darin, 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 Zustands mehrerer gleichzeitiger Anwendungen, einschließlich Multithread- und verteilter Anwendungen. Es arbeitet direkt auf der ausführbaren Binärdatei des Benutzers, ohne Linux-Kernel-Module oder andere Kernel-Modifikationen.
Es gibt auch eine nette Wikipedia-Seite zum Argument:Application_checkpointing
Die Antworten, die ctrl-z
erwähnen sprechen eigentlich davon, den Prozess mit einem Signal zu stoppen, in diesem Fall SIGTSTP
. Mit kill
können Sie ein Haltesignal geben :
kill -STOP <pid>
Dadurch wird die Ausführung des Prozesses ausgesetzt. Es wird den von ihm verwendeten Speicher nicht sofort freigeben, aber da Speicher für andere Prozesse benötigt wird, wird der vom gestoppten Prozess verwendete Speicher nach und nach 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 Sie möchten, dass der gestoppte Prozess ein Herunterfahren/Neustarten des Systems überstehen kann - es klingt nicht so, als würden Sie das brauchen.