Desarrollé un algoritmo para un problema matemático bastante difícil que probablemente necesite varios meses para terminar. Como solo tengo recursos limitados, comencé esto en mi computadora portátil Ubuntu 12.04 (x86). Ahora quiero instalar algunas actualizaciones y reiniciar la computadora portátil (el mensaje "reiniciar" es molesto).
¿Hay alguna manera de guardar un proceso completo, incluida su memoria asignada para continuar más allá de un reinicio?
Aquí hay información sobre el proceso que podría necesitar. No dude en solicitar más información si es necesario.
- Llamé al proceso en una terminal con el comando "
./binary > ./somefile &
" o "time ./binary> ./somefile &", realmente no puedo recordar. - Está imprimiendo información de depuración en std :: cerr (no muy a menudo).
- Actualmente está utilizando aproximadamente 600.0 kiB y aunque esto aumentará, es poco probable que aumente rápidamente.
- el proceso se ejecuta con prioridad normal
- el kernel es 3.2.0-26-generic-pae, la cpu es una AMD, el sistema operativo es Ubuntu 12.04 x86.
- funciona desde 9 días y 14 horas (demasiado tiempo para cancelarlo ;-))
Respuestas:
La solución mejor / más simple es cambiar su programa para guardar el estado en un archivo y reutilizar ese archivo para restaurar el proceso.
Según la página de wikipedia sobre instantáneas de aplicaciones, existen múltiples alternativas:
CONFIG_CHECKPOINT_RESTORE
habilitado.Esto ya es demasiado tarde, pero otro enfoque más práctico es comenzar su proceso en una máquina virtual dedicada y simplemente suspender y restaurar toda la máquina virtual. Dependiendo de su hipervisor, también puede mover la máquina entre diferentes hosts.
Para el futuro, piense en dónde ejecuta sus procesos de larga duración, cómo paralizarlos y cómo manejar los problemas, por ejemplo, discos completos, procesos que se eliminan, etc.
fuente
Una forma bastante "barata" de hacer esto sería hacer el procesamiento en una VM (por ejemplo, con VirtualBox). Antes de apagar, suspenda la VM y guarde el estado. Después del arranque, restaure la VM y el estado.
Esto tiene la desventaja de requerir matar y reiniciar el trabajo. Pero si realmente va a estar funcionando durante varios meses, entonces una diferencia de nueve días se vuelve trivial (aumento del 5% en 6 meses).
Editar: Me acabo de dar cuenta de que Ulrich ya mencionó esto en el elemento 4 sin numerar en su lista.
Todavía te animo a que consideres esto como una opción, especialmente porque ninguna de las alternativas parece una solución sólida. Cada uno tiene una razón por la que puede no funcionar.
Supongo que lo mejor sería probar uno de esos y, si no funciona, reiniciar el trabajo en una máquina virtual.
fuente
Eche un vistazo a la herramienta CryoPID .
Desde la página de inicio: "CryoPID le permite capturar el estado de un proceso en ejecución en Linux y guardarlo en un archivo. Este archivo se puede usar para reanudar el proceso más adelante, ya sea después de un reinicio o incluso en otra máquina".
fuente
Si termina necesitando reiniciar su programa, le recomiendo que dedique un poco de tiempo agregando algunas características a su código que podrían ahorrarle tiempo en el futuro.
Si el proceso se va a ejecutar durante mucho tiempo, poder guardar todo el estado del proceso cuando reinicie la máquina quizás no sea de gran ayuda si su proceso se bloquea mientras se está ejecutando.
Le animo a que envíe su programa a un archivo de datos de "punto de control". Estos datos deberían ser suficientes para que su programa pueda reanudar desde el estado en que se encontraba cuando se guardó el archivo de punto de control. No necesita guardar todo el proceso, solo una instantánea de las variables relevantes que se utilizan en su cálculo, suficiente para que su cálculo se reanude donde lo dejó. Su código también necesitaría incluir alguna forma de lectura en los datos de este archivo para obtener su estado inicial.
Puede configurar su código para que cuando le envíe una señal, guarde uno de estos archivos de punto de control, de modo que pueda guardar el "estado" de su cálculo en cualquier momento.
¡Además, poder ver cómo cambian los datos a medida que avanza el cálculo puede ser interesante en sí mismo!
fuente