Ich habe einen Algorithmus für ein ziemlich schweres Problem in der Mathematik entwickelt, für dessen Abschluss wahrscheinlich mehrere Monate erforderlich sind. Da ich nur begrenzte Ressourcen habe, habe ich dies auf meinem Ubuntu 12.04 (x86) -Laptop gestartet. Jetzt möchte ich einige Updates installieren und den Laptop neu starten (die Meldung "Bitte neu starten" ist nur ärgerlich).
Gibt es eine Möglichkeit, einen gesamten Prozess einschließlich des zugewiesenen Speichers für die Fortsetzung nach einem Neustart zu speichern?
Hier finden Sie einige Informationen zu dem Vorgang, den Sie möglicherweise benötigen. Bitte fordern Sie bei Bedarf weitere Informationen an.
- Ich habe den Prozess in einem Terminal mit dem Befehl "
./binary > ./somefile &
" oder "time ./binary> ./somefile &" aufgerufen, kann mich aber nicht wirklich erinnern. - Es druckt einige Debug-Informationen nach std :: cerr (nicht sehr oft).
- Derzeit werden ungefähr 600,0 kiB verbraucht, und obwohl dies zunehmen wird, ist es unwahrscheinlich, dass es schnell zunimmt.
- Der Prozess läuft mit normaler Priorität ab
- Der Kernel ist 3.2.0-26-generic-pae, die CPU ist eine AMD, das Betriebssystem ist Ubuntu 12.04 x86.
- es läuft seit 9 tagen und 14 stunden (also zu lange um es zu stornieren ;-))
Antworten:
Die beste / einfachste Lösung besteht darin, Ihr Programm zu ändern, um den Status in einer Datei zu speichern und diese Datei erneut zu verwenden, um den Prozess wiederherzustellen.
Basierend auf der Wikipedia-Seite zu Anwendungsschnappschüssen gibt es mehrere Alternativen:
CONFIG_CHECKPOINT_RESTORE
aktiviert sein.Dies ist bereits zu spät. Ein weiterer praktischer Ansatz besteht darin, den Prozess in einer dedizierten VM zu starten und die gesamte virtuelle Maschine anzuhalten und wiederherzustellen. Abhängig von Ihrem Hypervisor können Sie den Computer auch zwischen verschiedenen Hosts verschieben.
Überlegen Sie sich für die Zukunft, wo Sie Ihre lang laufenden Prozesse ausführen, wie Sie sie parallisieren und wie Sie mit Problemen umgehen, z.
quelle
Ein ziemlich "billiger" Weg, dies zu tun, wäre die Verarbeitung in einer VM (z. B. mit VirtualBox). Bevor Sie herunterfahren, halten Sie die VM an und speichern Sie den Status. Stellen Sie nach dem Booten den VM & Status wieder her.
Dies hat den Nachteil, dass der Job beendet und neu gestartet werden muss. Aber wenn es tatsächlich mehrere Monate läuft, wird ein Unterschied von neun Tagen unwesentlich (5% mehr als 6 Monate).
Edit: Mir ist gerade aufgefallen, dass Ulrich dies bereits in Punkt 4 seiner Liste erwähnt hat.
Ich möchte Sie dennoch ermutigen, dies als Option in Betracht zu ziehen, zumal keine der Alternativen als robuste Lösung erscheint. Jeder hat einen Grund, warum es möglicherweise nicht funktioniert.
Ich nehme an, das Beste, was Sie tun können, ist, einen dieser Vorgänge zu versuchen. Wenn dies nicht funktioniert, starten Sie den Job in einer VM neu.
quelle
Werfen Sie einen Blick auf das Tool CryoPID .
Von der Homepage aus: "Mit CryoPID können Sie den Status eines laufenden Prozesses in Linux erfassen und in einer Datei speichern. Diese Datei kann dann verwendet werden, um den Prozess später fortzusetzen, entweder nach einem Neustart oder sogar auf einem anderen Computer."
quelle
Wenn Sie am Ende Ihr Programm neu starten müssen, würde ich Sie ermutigen, einige Zeit damit zu verbringen, Ihrem Code einige Funktionen hinzuzufügen, die Ihnen in Zukunft Zeit sparen könnten.
Wenn der Prozess längere Zeit ausgeführt wird, ist es möglicherweise nicht sehr hilfreich, den gesamten Prozessstatus beim Neustart des Computers zu speichern, wenn der Prozess während der Ausführung abstürzt.
Ich würde Sie ermutigen, Ihr Programm in eine Datei "Checkpoint" -Daten ausgeben zu lassen. Diese Daten sollten ausreichen, damit Ihr Programm den Status zum Zeitpunkt des Speicherns der Prüfpunktdatei wiederherstellen kann. Sie müssen nicht den gesamten Prozess speichern, sondern nur eine Momentaufnahme der relevanten Variablen, die in Ihrer Berechnung verwendet werden. Dies reicht aus, damit Ihre Berechnung dort fortgesetzt werden kann, wo sie aufgehört hat. Ihr Code müsste auch eine Möglichkeit zum Einlesen der Daten aus dieser Datei enthalten, um den Startzustand zu erhalten.
Sie können Ihren Code so einrichten, dass beim Senden eines Signals eine dieser Prüfpunktdateien gespeichert wird, sodass Sie den "Status" Ihrer Berechnung jederzeit speichern können.
Darüber hinaus könnte es für sich selbst interessant sein zu sehen, wie sich die Daten im Verlauf der Berechnung ändern!
quelle