¿Cómo recuperar archivos abiertos pero eliminados en Linux usando ln en lugar de cp?

8

Tengo un archivo que se está descargando (de una fuente difícil de volver a descargar), pero se eliminó accidentalmente del espacio de nombres del sistema de archivos (/ tmp / blah), y me gustaría recuperar este archivo.

Normalmente podría cp /proc/$PID/fd/$FD /tmp/blah, pero en este caso eso solo me daría una instantánea parcial, ya que el archivo aún se está descargando. Además, una vez que se completa la descarga, el proceso de descarga (por ejemplo, Chrome) cerrará el FD.

¿Alguna forma de recuperarse por inode / crear un enlace duro? ¿Alguna otra solución? Si hace alguna diferencia, me preocupa principalmente ext4.

Yang
fuente

Respuestas:

11

Intenta usar tail para copiar el archivo continuamente:

tail -c +0 -f /proc/$pid/fd/$fd > filename

Por supuesto, tendrá que detener el proceso de cola a mano (o algún otro medio externo) cuando la descarga haya finalizado.

Stijn Hoop
fuente
Funciona de maravilla. Supongo que esto fue mucho más fácil de lo que pensaba, ya que todo lo que necesitas es realmente otro programa que abre el mismo archivo para mantenerlo.
Yang
4

El proyecto fdlink , que consiste en un módulo de kernel de Linux y una aplicación simple, pretende crear un nuevo enlace a un descriptor de archivo abierto. No lo he intentado

asesino
fuente
1

Esto hará el trabajo, aunque no a través de la recuperación del inodo:

cp /proc/$PID/fd/$FD /tmp/blah
kill $PID
wget -c $URL -O /tmp/blah

O simplemente detenga manualmente la descarga en Chrome si no desea eliminar todo el navegador.

Pavel
fuente
¡Si tan solo el problema fuera tan simple que simplemente pudiera reanudar / volver a descargar! Aclaré la pregunta para indicar que no puedo asumir que puedo volver a descargar.
Yang
Suena como un problema :-) Parece que cualquier pirateo basado en inodo es demasiado bajo y específico del sistema de archivos.
Pavel
Sí, también agregué esto a mi pregunta: si hace alguna diferencia, me preocupa principalmente ext4.
Yang
1

Si desea hacer un enlace duro sobre esto, debe usar la opción -s (ver man ln) para que en el directorio fd ejecute ls -fy encuentre el número de archivo (en su mayoría números de dos dígitos) y haga unln NUMBER destination-file -s

meisterlei
fuente