Supposons qu'un fichier journal apache soit supprimé mais qu'il soit maintenu ouvert par apache; alors c'est ce que je fais:
pid=$(lsof | grep text.txt | awk '/deleted/ {print $2}')
fd=$(lsof | grep text.txt | awk '/deleted/ {print $4}' | grep -oE "[[:digit:]]{1,}")
cp /proc/$pid/fd/$fd directorytobecopied/testfile.txt
Voici ce que je fais pour récupérer le fichier et le remettre où il était. Existe-t-il un moyen plus simple de le faire, car le code ci-dessus ne semble pas bon. De plus, comment puis-je savoir d'où le fichier a été supprimé ( répertoire copié) pour ne pas avoir à demander manuellement à quelqu'un où se trouvait le fichier à l'origine et le remettre là-bas.
linux
shell
logs
data-recovery
apache-httpd
munish
la source
la source
lsof / | awk '(/deleted/||/abc.txt/) {print "FD :-",$4,"| File Name:-",$9}'
Réponses:
Si un fichier a été supprimé mais est toujours ouvert, cela signifie que le fichier existe toujours dans le système de fichiers (il a un inode ) mais a un nombre de liens durs de 0. Puisqu'il n'y a pas de lien vers le fichier, vous ne pouvez pas l'ouvrir par son nom . Il n'y a pas non plus de possibilité d'ouvrir un fichier par inode.
Il n'y a aucun moyen de découvrir le fichier via son système de fichiers, et surtout aucun moyen de rechercher le fichier dans le répertoire où il se trouvait en dernier. L'entrée du répertoire a disparu. Il ne reste que le fichier lui-même. Vous pouvez accéder au fichier avec un débogueur de système de fichiers, mais cela nécessite des autorisations root et est difficile à utiliser et source d'erreurs.
Linux expose les fichiers ouverts via des liens symboliques spéciaux sous
/proc
. Ces liens sont appelés/proc/12345/fd/42
où 12345 est le PID d'un processus et 42 est le numéro d'un descripteur de fichier dans ce processus. Un programme fonctionnant avec le même utilisateur que ce processus peut accéder au fichier (les autorisations de lecture / écriture / exécution sont les mêmes que celles que vous aviez lorsque le fichier a été supprimé).Le nom sous lequel le fichier a été ouvert est toujours visible dans la cible du lien symbolique: si le fichier l'était
/var/log/apache/foo.log
, alors la cible du lien est/var/log/apache/foo.log (deleted)
. (Si le fichier a été renommé après son ouverture, la cible du lien symbolique peut refléter le changement de nom.)Ainsi, vous pouvez récupérer le contenu d'un fichier supprimé ouvert étant donné le PID d'un processus qui l'a ouvert et le descripteur sur lequel il est ouvert comme ceci:
Si vous ne connaissez que l'ID de processus mais pas le descripteur, vous pouvez récupérer tous les fichiers avec
Si vous ne connaissez pas non plus l'ID de processus, vous pouvez rechercher parmi tous les processus:
Vous pouvez également obtenir cette liste en analysant la sortie de
lsof
, mais elle n'est ni plus simple, ni plus fiable, ni plus portable (c'est spécifique à Linux de toute façon).la source