Solía mantener CryoPID, que es un programa que hace exactamente lo que dices. Escribe el contenido del espacio de direcciones de un programa, VDSO, referencias de descriptor de archivo y estados en un archivo que luego se puede reconstruir. CryoPID comenzó cuando no había ganchos utilizables en Linux y funcionó completamente desde el espacio del usuario (en realidad, todavía funciona, dependiendo de la configuración de distribución/kernel/seguridad).
Los problemas fueron (de hecho) sockets, señales RT pendientes, numerosos problemas con X11, la implementación de getpid() de almacenamiento en caché de glibc, entre muchos otros. La aleatorización (especialmente VDSO) resultó ser insuperable para los pocos de nosotros que trabajamos en ella después de que Bernard se alejara. Sin embargo, fue divertido y se convirtió en el tema de varias tesis de maestría.
Si solo está contemplando un programa que puede guardar su estado de ejecución y reiniciar directamente en ese estado, es mucho... mucho... más fácil simplemente guardar esa información desde dentro del programa mismo, tal vez al dar servicio a una señal.
Me gustaría poner una actualización de estado aquí, a partir de 2014.
La respuesta aceptada sugiere CryoPID como herramienta para realizar puntos de control/restauración, pero descubrí que el proyecto no tenía mantenimiento y era imposible de compilar con núcleos recientes. Ahora, encontré dos proyectos mantenidos activamente que brindan la función de puntos de control de la aplicación.
El primero, el que sugiero porque tengo más suerte al ejecutarlo, es CRIU, que realiza puntos de control/restauración principalmente en el espacio de usuario, y requiere que la opción de kernel CONFIG_CHECKPOINT_RESTORE esté habilitada para funcionar.
Checkpoint/Restore In Userspace, o CRIU (pronunciado kree-oo, IPA:/krɪʊ/, ruso:криу), es una herramienta de software para el sistema operativo Linux. Con esta herramienta, puede congelar una aplicación en ejecución (o parte de ella) y controlarla en un disco duro como una colección de archivos. Luego puede usar los archivos para restaurar y ejecutar la aplicación desde el punto en que se congeló. La característica distintiva del proyecto CRIU es que se implementa principalmente en el espacio del usuario.
Este último es DMTCP; citando de su página principal:
DMTCP (Distributed MultiThreaded Checkpointing) es una herramienta para verificar de forma transparente el estado de varias aplicaciones simultáneas, incluidas las aplicaciones multiproceso y distribuidas. Opera directamente en el ejecutable binario del usuario, sin ningún módulo del kernel de Linux u otras modificaciones del kernel.
También hay una buena página de Wikipedia sobre el argumento:Application_checkpointing
Las respuestas que mencionan ctrl-z
en realidad estamos hablando de detener el proceso con una señal, en este caso SIGTSTP
. Puede emitir una señal de alto con kill
:
kill -STOP <pid>
Eso suspenderá la ejecución del proceso. No liberará inmediatamente la memoria utilizada por él, pero como se requiere memoria para otros procesos, la memoria utilizada por el proceso detenido se intercambiará gradualmente.
Cuando quieras reactivarlo de nuevo, usa
kill -CONT <pid>
Las soluciones más complicadas, como CryoPID, realmente solo son necesarias si desea que el proceso detenido pueda sobrevivir a un apagado/reinicio del sistema; no parece que lo necesite.