Una din lucrurile interesante ce pot fi făcute cu lsof este de a recupera fişiere care tocmai au fost şterse.

În linux un fişier este un pointer către un inode, care conţine informaţii despre fişier (permisiuni, deţinător, şi unde este conţinul său în realitate pe disc). Stergând fişierul se şterg defapt legăturile către inode, dar nu şi inode-ul – dacă un alt proces îl are deja deschis, nu poate fi dat spre scriere până procesul respectiv nu a terminat lucrul cu inode-ul respectiv.

Pentru a încerca asta, creaţi un fişier, salvaţil ca şi sample.txt apoi tastaţi less sample.txt. Acum deschideţi alt terminal, şi tastaţi rm sample.txt. Dacă încercaţi acum ls sample.txt veţi primii un mesaj de eroare, deoarece legăturile către fisier au fost şterse. Dar, less încă are o referinţă către fişier. Aşadar acum tastam:

  # lsof | grep sample.txt
  less 24080 ramu 4r REG 8,2 14 3096673 .../sample.txt (deleted)

Coloanele importante sunt a doua, care ne dă PID-ul procesului care tine fişierul deschis (24080), şi a patra, care ne dă descriptor-ul fişierului (4). Acum, mergem în /proc, unde înca există o referinţă către inode, de unde se poate copia fişierul înapoi (adică recupera):

  # ls -l /proc/24080/fd/4
  lr-x------ 1 ramu users 64 2009-06-02 18:46 /proc/24080/fd/4 -> .../sample.txt (deleted)

  # cp /proc/24080/fd/4 sample.txt

Notă: A NU se folosii opţiunea -a cu cp, pentru că aceasta va copia numai legătura simbolică, mai degrabă decât conţinutul real al fişierului.

Acum, verificaţi fişierul si asiguraţi-vă că aveţi ceea ce credeţi că ati vrea, şi aţi terminat!

P.S. În mod evident, circumstantele nu pot fi întotdeauna astfel, asa că această abordare poate fi utilizată doar dacă un alt proces are fişierul deschis. In rest nu poteti să utilizaţi această metodă pentru a recupera un fisier.

Tradus de la LinuxJournal