14 votes

Lien vers un inode spécifique

J'ai un fichier qui a été supprimé, mais qui est toujours maintenu ouvert par un programme. J'ai trouvé le numéro d'inode en utilisant lsof. Comment puis-je créer un lien dur vers cet inode ?

31voto

sunny256 Points 861

Vous ne pouvez pas créer un lien vers celui-ci, mais vous pouvez le récupérer. Faisons une expérience :

$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt

monfichier.txt a maintenant disparu, mais l'inode est maintenu en vie par la commande tail. Pour récupérer votre fichier, trouvez d'abord le PID du processus qui garde l'inode :

$ ps auxw | grep tail
sunny      409  0.0  0.0   8532   824 pts/5    S    18:07   0:00 tail -f myfile.txt

Le PID est 409. chdir vers /proc/409/fd/ et lister le contenu :

dr-x------ 2 sunny sunny  0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny  0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)

Les répertoires /proc/[PID]/fd/ contiennent des liens symboliques vers les descripteurs de fichiers de tous les fichiers utilisés par le processus. Dans ce cas, le lien symbolique "3" pointe vers le fichier supprimé. Donc, pour restaurer le fichier, copiez son contenu dans un nouveau fichier :

$ cat 3 >/home/mydir/saved_file.txt

0 votes

J'ai fait cela avec un débogueur de système de fichiers dans un passé lointain (par exemple "debugfs dump"), mais le concept est le même.

0 votes

Cela ne fonctionne pas pour moi. Etant donné que '3' est un lien symbolique, et non un "vrai" descripteur de fichier, cela crée toujours un fichier vide.

4 votes

@Rob : Non, ce n'est pas le cas. Si le descripteur de fichier est utilisé, le lien symbolique pointe vers des données valides, sinon le lien symbolique n'existerait pas. Lorsque le fichier est fermé, le lien symbolique disparaît. Vous avez bien inséré un espace après le "3" ? Si ce n'est pas le cas, vous afficherez le contenu du descripteur de fichier 3 dans le Shell actuel à la place, et c'est probablement vide.

2voto

eMBee Points 21

Pour récupérer le fichier entier s'il est toujours écrit pour essayer tail -c +1 -f

de : https://unix.stackexchange.com/questions/25527/how-to-follow-a-la-tail-f-a-binary-file-from-the-beginning

(btw : ln depuis le fd sur /proc ne fonctionne pas, je viens de l'essayer)

-8voto

rrichter Points 2273

Il n'y a pas de moyen portable de faire cela sous Linux. Le meilleur moyen serait probablement de faire cesser toute activité sur le système de fichiers, de tuer le programme qui maintient le fichier ouvert, de démonter le système de fichiers et d'utiliser un débogueur de système de fichiers pour le rattacher à un répertoire. Si le système de fichiers est exporté par NFS, au moins certaines versions de NFS peuvent vous permettre de lire les données du fichier à travers NFS.

2 votes

Vous risquez de perdre le fichier une fois que vous aurez arrêté le programme

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X