हटाए गए फ़ाइल को पुनर्प्राप्त करने के लिए कैसे करें अगर यह अभी भी किसी प्रक्रिया द्वारा खोला गया है?


19
$ cat important_file > /dev/null &
[1] 9711
$ rm important_file 
$ killall -STOP cat

[1]+  Stopped                 cat important_file > /tmp/p
$ ls -l /proc/`pidof cat`/fd/
total 0
lrwx------ 1 vi vi 64 May 13 20:32 0 -> /dev/pts/29
l-wx------ 1 vi vi 64 May 13 20:32 1 -> /tmp/p
lrwx------ 1 vi vi 64 May 13 20:32 2 -> /dev/pts/29
lr-x------ 1 vi vi 64 May 13 20:32 3 -> /home/vi/important_file (deleted)

इसे कैसे ठीक किया जाए important_file?

मैंने कुछ ऐसा करने की कोशिश की

injcode -m dup2 -ofd=3 -ofilename=/tmp/recovered_file -oflags=O_CREAT $PID_OF_CAT

लेकिन यह कुछ नहीं करता है।

जवाबों:


11

यदि / घर एनएफएस है, तो एक .nfsNNNNNNNNNNN फ़ाइल / होम / vi में होगी जिसे आप एक्सेस / कॉपी कर सकते हैं। यदि घर एक स्थानीय फाइल सिस्टम है, तो आपको / proc / PID / fd / 3 लिंक के माध्यम से एक ही काम करने में सक्षम होना चाहिए:

cp /proc/PID/fd/3 /tmp/recovered_file

यदि आप वास्तव में फ़ाइल को हटाना चाहते हैं, तो इस विषय पर एक ब्लॉग पोस्ट है


1
ठीक है, मैं इससे भ्रमित था readlink /proc/13381/fd/3-> "/ घर / vi / important_file (हटाए गए)" और /home/vi/important_file\ \(deleted\)स्पष्ट रूप से मौजूद नहीं है।
वि।

22

... किसी दिए गए समय पर कॉपी करने से बेहतर (और केवल उस समय फ़ाइल की सामग्री का स्नैपशॉट इकट्ठा करना) tail -fउस फ़ाइल को एक नई फ़ाइल में " " करना है:

tail -c +0 -f /proc/PIDofProgram>/fd/# > /new/path/to/file

(पूंछ के सतर्क प्रोग्रामर के लिए धन्यवाद, जो बाइनरी आउटपुट के साथ भी काम करेगा।)

अपने रनटाइम के दौरान, tail -fस्वयं फ़ाइल को खुला रखता है, मूल प्रोग्राम के समाप्त होने पर इसे डिस्क से शुद्ध होने से रोकता है। इस प्रकार, बंद नहीं करते tail -fअपने मूल कार्यक्रम समाप्त होने के बाद तुरंत - tail'ed जाँच /new/path/to/fileपहले चाहे वह है तुम क्या चाहते। यदि यह (या किसी अन्य कारण से असंतोषजनक) नहीं है, तो आप मूल फ़ाइल को फिर से कॉपी कर सकते हैं, लेकिन इस बार यह लिखने के बाद भी "प्रोग्राम" द्वारा समाप्त हो गया है और अभी भी चल रहा है tail -f/ proc / PIDoftail / से fd / निर्देशिका।


3
क्या एक हार्डलिंक बनाने के बारे में / proc / PIDofProgram> / fd / #?
बेको

2
@ फैको Invalid cross-device link
कामिल मैकियोरोस्की

10

इनसोड संख्या ज्ञात करने के लिए lsof का प्रयोग करें, और इसके लिए एक कठिन लिंक पुनः बनाने के लिए डीबगफ़ करें। उदाहरण के लिए:

# lsof -p 12345 | grep /var/log/messages
syslogd 12345 root    3w   REG                8,3    3000    987654 /var/log/messages (deleted)
# mount | grep var
/dev/sda2 on /var type ext3 (rw)
# debugfs -w /dev/sda2
debugfs: cd log
debugfs: ln <987654> tmp
debugfs: mi tmp
                      Mode    [0100600] 
                   User ID    [0] 
                  Group ID    [0] 
                      Size    [3181271] 
             Creation time    [1375916400] 
         Modification time    [1375916322] 
               Access time    [1375939901]
             Deletion time    [9601027] 0
                Link count    [0] 1
               Block count    [6232] 
                File flags    [0x0] 
...snip...
debugfs:  q
# mv /var/log/tmp /var/log/messages
# ls -al /var/log/messages
-rw------- 0 root root 3301 Aug  8 10:10 /var/log/messages

इससे पहले कि आप शिकायत करें, मैंने उपरोक्त प्रतिलेख को फेक कर दिया क्योंकि मेरे पास अभी हटाने के लिए कोई डिलीट की गई फाइल नहीं है;;

मैं miडिलीट टाइम और लिंक गणना को समझदार मान (0 और 1 क्रमशः) पर रीसेट करने के लिए उपयोग करता हूं , लेकिन यह ठीक से काम नहीं करता है - आप देख सकते हैं कि लिंक की संख्या शून्य पर बनी हुई है ls। मुझे लगता है कि कर्नेल इनोड डेटा को कैशिंग कर सकता है। आपको संभवतः डिबगफ़्स का उपयोग करने के बाद सबसे शुरुआती अवसर पर fsck होना चाहिए, सुरक्षित पक्ष पर होने के लिए।

मेरे अनुभव में, आपको एक अस्थायी फ़ाइल नाम का उपयोग करके लिंक बनाना चाहिए और फिर उचित नाम पर नाम बदलना चाहिए। इसे सीधे मूल फ़ाइल नाम से जोड़ना निर्देशिका भ्रष्टाचार का कारण बनता है। YMMV!


अगर आप वास्तव में ठीक से काम नहीं करते हैं और सिस्टम को नुकसान पहुंचाते हैं तो आप इसे क्यों सुझा रहे हैं? मुझे लगता है कि आपको जवाब के भीतर एक और ज्वलंत अस्वीकरण होना चाहिए कि यह बस एक वाईपी है, और वास्तव में उत्पादन में प्रयास नहीं किया जाना चाहिए।
cnst 4'14

3

आप बस cpफ़ाइल कर सकते हैं , अर्थात:

cp /proc/<pid>/fd/<fdno> /new/path/to/file

बेशक, यदि फ़ाइल अभी भी संशोधित की जा रही है, तो आप इस दृष्टिकोण से परेशानी में पड़ेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.