Comment récupérer un fichier ouvert mais supprimé sur Linux en utilisant ln au lieu de cp?

8

J'ai un fichier en cours de téléchargement (à partir d'une source difficile à télécharger à nouveau), mais supprimé accidentellement de l'espace de noms du système de fichiers (/ tmp / blah), et j'aimerais récupérer ce fichier.

Normalement, je pourrais juste cp /proc/$PID/fd/$FD /tmp/blah, mais dans ce cas, cela ne me procurerait qu'un instantané partiel, car le fichier est toujours en cours de téléchargement. De plus, une fois le téléchargement terminé, le processus de téléchargement (par exemple Chrome) fermera le FD.

Est-il possible de récupérer par inode / créer un lien dur? D'autres solutions? Si cela fait une différence, je suis principalement concerné par ext4.

Yang
la source

Réponses:

11

Essayez d'utiliser tail pour copier le fichier en continu:

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

Bien sûr, vous devrez arrêter le processus de queue à la main (ou tout autre moyen externe) lorsque le téléchargement sera terminé.

Stijn Hoop
la source
Fonctionne comme un charme. Je suppose que cela a été beaucoup plus facile que je ne le pensais, car tout ce dont vous avez besoin est vraiment juste un autre programme qui ouvre le même fichier pour le garder.
Yang
4

Le projet fdlink , composé d'un module du noyau Linux et d'une application simple, prétend créer un nouveau lien vers un descripteur de fichier ouvert. Je ne l'ai pas essayé.

coneslayer
la source
1

Cela fera le travail, mais pas en récupérant l'inode:

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

Ou arrêtez simplement le téléchargement manuellement dans Chrome si vous ne voulez pas tuer tout le navigateur.

Pavel
la source
Si seulement le problème était si simple que je pourrais simplement reprendre / re-télécharger! J'ai clarifié la question pour indiquer que je ne peux pas supposer que je peux télécharger à nouveau.
Yang
Cela semble être un problème :-) Il semble que tous les hacks basés sur l'inode soient trop bas et spécifiques au système de fichiers.
Pavel
Oui, j'ai juste ajouté ceci à ma question: si cela fait une différence, je suis principalement concerné par ext4.
Yang
1

Si vous voulez faire un lien dur à ce sujet, vous devez utiliser l'option -s (voir man ln) donc dans le répertoire fd exécutez ls -fet trouvez le numéro de fichier (principalement des nombres à deux chiffres) et faites unln NUMBER destination-file -s

meisterlei
la source