Cambiar el disco utilizado por un proceso de larga ejecución

Cambiar el disco utilizado por un proceso de larga ejecución

Supongamos que tengo un proceso que realiza cálculos largos (por ejemplo, ha estado ejecutándose durante días), utiliza un disco como almacenamiento temporal para almacenar resultados intermedios (por ejemplo, montado en /mnty quiero reemplazar /dev/sda1por /dev/sdb1). ¿Cómo puedo reemplazar ese disco por otro disco sin matar ese proceso y sin perturbarlo demasiado?

Esa es una pregunta general que no estoy pensando en un programa en particular. Digamos que ejecutamos una versión reciente de Linux.

Respuesta1

Si el proceso utiliza algún directorio para crear y eliminar archivos temporales, probablemente pueda intentar detenerlo con kill -STOP $pidun comando y echar un vistazo a /proc/$pid/fd para ver los descriptores de archivos abiertos.

Si no hay ninguno abierto, puede cambiar de forma segura la ubicación de montaje, copiar sus archivos y continuar trabajando con kill -CONT $pid.

Si todavía hay algunos archivos abiertos o el proceso no cierra, puede intentar migrar descriptores de archivos usando GDB. Lo intenté a mano y funcionó, pero encontré un script que puede hacerlo por ti:http://ingvar.blog.redpill-linpro.com/2010/07/10/changing-a-process-file-descriptor-on-the-fly/

Tenga cuidado si el proceso se está comunicando a través de la red, cuando lo detenga, las conexiones podrían expirar, por lo que debe hacerlo lo más rápido posible (probablemente pruebe la secuencia de comandos en el proceso ficticio antes y ejecútelo como lote).

Aunque creo que funcionaría, prefieroNo recomendadousted debe hacerlo en un entorno de producción.

EDITAR: También puede ver los sockets de red abiertos en /proc/$pid/fd para que pueda determinar si el proceso está usando la red o no.

Respuesta2

Esto depende completamente del comportamiento de su proceso cuando utiliza su almacenamiento temporal.

Si su proceso mantiene un archivo abierto en /mnt, entonces no puede reemplazar el dispositivo sin causar que el proceso falle de alguna manera indefinida, incluso si logra desmontar el dispositivo a la fuerza. Los procesos generalmente no esperan que desaparezcan los dispositivos en los que tienen archivos abiertos.

Si su proceso abre, escribe y luego cierra archivos en /mnt, es posible que pueda detenerlo, desmontarlo, volverlo a montar /mnty reiniciarlo. Esto depende de que puedas detener el proceso mientras no se esté utilizando /mnt. Así que podrías

$ kill -STOP pid
$ lsof -p pid | grep /mnt
... then, if it has nothing open on /mnt ...
$ sudo umount /mnt
$ sudo mount /dev/sdb1 /mnt
$ kill -CONT pid

Esto no necesariamente funcionará incluso si detiene el proceso sin archivos abiertos /mnt, porque es posible que haya interrumpido alguna lógica que depende de /mntno cambiar; algo como

  • comprobar si /mnt/wibbleexiste
  • ¡Lo hace! Preparémonos para abrirlo y leerlo.
  • ...el proceso se detiene y se monta un dispositivo diferente en /mnt...
  • ...el proceso se reinicia...
  • ¡Oh, no! /mnt/wibble¡No se puede abrir!
  • morir horriblemente

Respuesta3

Cualquier programa que realice cálculos que duren días debe diseñarse para enviar suficiente estado al disco periódicamente. Si reiniciar el proceso significa que pierde una hora de tiempo de procesamiento, puede estar bien, pero si pierde más que eso, diría que ese programa está mal diseñado.

Dicho esto, puede haber otros escenarios en los que desee mantener vivo un proceso durante más tiempo y poder reemplazar un disco que se encuentra debajo de él. Para esas situaciones, debería considerar desacoplar el sistema de archivos del medio físico.

Las opciones posibles incluyen:

  1. Usar incursión de software
  2. Utilice otra capa de dispositivo de bloque virtual (tal vez LVM sea adecuado)
  3. Utilice un sistema de archivos, que a su vez pueda utilizar varios dispositivos subyacentes.

información relacionada