2008-10-10 5 views
11

Me preguntaba si es posible generar un archivo "core", copiarlo en otra máquina y luego continuar la ejecución del archivo core en esa máquina.¿Puede congelar un proceso C/C++ y continuarlo en un host diferente?

he visto la utilidad gcore que hará que un archivo básico de un proceso en ejecución. Pero no creo que gdb pueda continuar la ejecución en base a un archivo central.

¿Hay alguna manera de simplemente volcar la pila/pila y los y restaurar en un momento posterior?

+1

¿Qué tiene que ver esto con C/C++? – camh

+1

De acuerdo con camh, ¿Podría eliminar la referencia de C/C++? Puede tener un proceso, cuyo código es completamente automático y la pregunta es válida. –

Respuesta

4

En sistemas modernos, no desde un archivo central, no, no puede. Para congelar y restaurar un proceso individual en Linux, CryoPID y el nuevo Kernel-based checkpoint and restart están en proceso, pero sus capacidades son actualmente bastante limitadas. OpenVZ y otros softwares similares a la virtualización pueden congelar y restaurar un sistema completo.

-1

No creo que esto sea posible. Sin embargo, es posible que desee examinar el software de virtualización, p. Xen - que permiten congelar y mover imágenes enteras del sistema de una máquina a otra.

2

Esto no es así, en general, ser suficiente para permitir que un proceso arbitrario continuar en otra máquina. Además del estado del montón y de la pila, también puede abrir controladores de E/S, recursos de hardware asignados, etc.

Sus opciones son escribir explícitamente su software de forma que permita volcar el estado en un señal y luego reanudar desde el estado objeto de dumping, o ejecutar su software en una máquina virtual y migrarlo al host alternativo: Xen y Vmware admiten congelación/restauración, así como migración en vivo.

Dicho esto, CryoPID intentos de hacer precisamente esto y de vez en cuando tiene éxito.

1

En algunos casos, esto se puede hacer. Por ejemplo, parte del proceso de compilación de Emacs es cargar todas las bibliotecas Lisp y luego volcar la imagen de memoria en el disco para una carga rápida. Algunos intérpretes de otros idiomas también lo hacen (estoy pensando en las implementaciones de Lisp y Scheme, principalmente). Sin embargo, están especialmente diseñados para ese tipo de uso, por lo que no sé qué cosas especiales tienen que hacer para que funcionen.

Creo que esto sería muy difícil de hacer para un programa aleatorio, pero si escribió un marco donde todos los objetos admiten serialización/deserialización, puede serializar todos los objetos utilizados por su programa y luego enviarlos a otro lugar, y deserializarlos en el otro extremo.

Las respuestas de otras personas sobre la virtualización también están en el lugar.

0

Depende de la máquina. Es muy factible en un sistema integrado muy pequeño, por ejemplo. Creo que también está implementado de alguna forma en los clústeres de Beowulf y otras aplicaciones supercomputersqueras.

3

también comprobación a cabo el proyecto Condor. Condor también puede hacer eso con trabajos paralelos. Condor también incluye monitores que pueden migrar automáticamente su proceso cuando algunos, por ejemplo, vuelven a usar su estación de trabajo. Está realmente diseñado para utilizar ciclos de repuesto en entornos de red.

0

Hay muchas razones por las que no puedes hacer lo que quieres muy fácilmente. Por ejemplo, cuando restaura el archivo core en la otra máquina, ¿cómo se resuelven los descriptores de archivos que procesó? ¿Qué pasa con los sockets, pipes, semáforos o cualquier otro recurso de nivel de sistema operativo? Básicamente, a menos que su sistema esté específicamente diseñado para manejar una operación de este tipo, no puede volcar ingenuamente un archivo central y moverlo a otra máquina.

1

A partir de febrero de 2017, hay una herramienta bastante estable y madura, llamada CRIU que depende de las actualizaciones del núcleo de Linux realizadas en la versión 3.11 (como se hizo en septiembre de 2013, las distribuciones más modernas deberían tener incorporadas sus versiones de kernel).

Se puede instalar a través de aptitude simplemente llamando al sudo apt-get install criu.

Instructions on how to use it.

Cuestiones relacionadas