Een collega van mij had per ongeluk een log file deletet. de file was nog steeds in gebruik je kan er alleen op een normale manier niet meer bij. gelukkig is op een linux systeem een file gewoon een referentie naar een inode ergens op de disk, en die kunnen we gewoon weer uit lezen. de file die mijn collega verwijderd had was een java GC log file die roteerde op size. omdat ik niet wist wanneer dat exact ging gebeuren gebruikte we uit eindelijk een cron job om om de min een copy te maken van de file discriptor om minimaal verlies van log regels te voorkomen.
Maar je kan dit ook eenvoudig zelf testen. een je kan dit eenvoudig zelf testen. gebruik bv tcpdump om een file te genereren.
start tcpdump schrijf de output naar een file met -w en start het in de achter grond met de &
$ sudo tcpdump -w /tmp/`hostname`.pcap &
controleer of tcpdump draait. en of de file gevuld word.
$ ps -ef |grep tcpdump root 11977 9086 0 08:43 pts/0 00:00:00 sudo tcpdump -w /tmp/defiant.pcap $ ls -al /tmp/defiant.pcap.bck -rw-r--r-- 1 root root 282624 Jun 18 10:38 /tmp/defiant.pcap
het proces draait en de file word geschreven. nu kunnen we hem verwijderen.
$ sudo rm -f /tmp/defiant.pcap.bck $ ls -la /tmp/defiant.pcap ls: cannot access '/tmp/defiant.pcap': No such file or directory
Om nu de inhoud van de file op te vragen zoeken we de file discriptor op. dit kan het het eenvoudigste doen met lsof als lsof niet voor handen is kan het je ook met de hand op zoeken. maar als je een proces hebt met veel open files kan het wat lastig zijn. in geval van lsof grep op de bestand naam.
$ sudo lsof |grep /tmp/defiant.pcap tcpdump 17455 root 4w REG 253,0 1507328 393160 /tmp/defiant.pcap (deleted)
belangrijk in deze output zijn het PID in de 2de kolomm en de 4w in de 4de kolom. je ziet ook dt lsof al aan geeft dat de file deleted is. in de 7de kolom staat de file size voer je het command nog een keer uit zal je zien dat de file size nog steeds groeit. we kunnen nu een copy maken van deze file. let wel op dat is dus een moment opnamen op dat moment. de file word op dit moment continue gevuld. als je het proces stopt ben je de inhoud dus ook kwijt. om de file te kunnen opvragen hebben we dus de pid 17455 nodig en de 4.
$ sudo ls -al /proc/17455/fd/4 l-wx------ 1 root root 64 Jun 18 10:38 /proc/17455/fd/4 -> '/tmp/defiant.pcap (deleted)'
om hem te copieren gewoon met een cp
sudo cp /proc/17455/fd/4 /tmp/defiant.pcap.BCK
ik maak bewust een copy naar een andere naam. om te voorkomen dat je in de war raakt. want zou je hem terug copieren naar /tmp/defiant.pcap is dat een andere file en heeft niets te maken met de oorspronkelijke deleted file.
Recente reacties