मैं संदर्भित प्रक्रियाओं को पुनरारंभ किए बिना हटाए गए फ़ाइलों पर मुक्त स्थान कैसे पुनर्प्राप्त कर सकता हूं?


12

जब किसी सर्वर पर बड़ी फ़ाइलों को हटा दिया जाता है, तो फ़ाइलों को अभी भी प्रक्रियाओं द्वारा संदर्भित किया जा सकता है, इसलिए फ़ाइल सिस्टम में अधिक खाली स्थान नहीं है।

मैंने lsof का उपयोग करने की कोशिश की , लेकिन ऐसा लगता है कि यह हटाई गई फ़ाइलों की सूची नहीं थी। fuser -cबेहतर काम किया, लेकिन प्रक्रियाओं की सूची प्रत्येक प्रक्रिया के लिए इसे जांचने के लिए अभी बहुत लंबी है, खासकर जब से प्रत्येक प्रक्रिया एक ओरेकल प्रक्रिया है।

bash-3.2# fuser -c /var
/var:      105o   29999o   20444c    3528c   27258o    7715o    3864o    3862o    2494o   18205o   17450co   17445co   14912co   14824co   14818co   14816o   14814o    8532c    8530c    7633com    7118o    6958o    6790c    6784co    6734o    6693o    6689o    6684o    6675o    6635o    6594c    6548o    6547o    6546o    6545o    6544o    6543o    6542o    6541o    6540o    6537o    6535o    6456o    6128co    6113o     335o     245co     229o     161o       8o
bash-3.2# du -hs /proc
 139T   /proc

ऐसा कभी-कभी होता है कि कोई फ़ाइल किसी एप्लिकेशन या उपयोगकर्ता द्वारा डिलीट हो जाती है, उदाहरण के लिए लॉगफ़ाइल और यह फ़ाइल अभी भी एक प्रक्रिया द्वारा संदर्भित की जा रही है जिसे फिर से शुरू नहीं किया जा सकता है।

क्या डिलीट की गई फाइल पर डिस्क स्पेस को पुनः प्राप्त करने के लिए माल विधियां हैं जो इस डिलीट की गई फाइल का संदर्भ है?


संदर्भ के लिए .. एक खुली हुई फ़ाइल को हटाने का एक बेहतर तरीका फ़ाइल में कॉपी / देव / अशक्त करना हैcp /dev/null file
माइक

@ माइक cp /dev/nullएक शून्य आदेश है क्योंकि cpकॉपी करने के लिए कुछ भी नहीं है, एक साधारण पुनर्निर्देशन सख्ती से समकक्ष है :>fileया यहां तक ​​कि>file
jlliagre

जवाबों:


12
find /proc/*/fd -ls 2> /dev/null | grep '(deleted)'

सभी खोले गए फ़ाइल विवरण खोजें।

Grep हटा दिया गया।

StdError to / dev / null

आउटपुट:

160448715    0 lrwx------   1 user      user            64 Nov 29 15:34 /proc/28680/fd/113 -> /tmp/vteT3FWPX\ (deleted)

या आप awk का उपयोग कर सकते हैं

find / proc / * / fd -ls 2> / dev / null | awk '/ delete / {प्रिंट $ 11}';

awk आउटपुट (bash Ubuntu 12.04 में परीक्षण किया गया):

/proc/28680/fd/113

सभी हटाई गई फ़ाइलों को ढूंढें और काट-छाँट करें (bash Ubuntu 12.04 में परीक्षण किया गया):

(यदि आप ऐसा नहीं करते हैं तो आप क्या करेंगे)

find /proc/*/fd -ls 2> /dev/null | awk '/deleted/ {print $11}' | xargs -p -n 1 truncate -s 0

ट्रंकट निष्पादित करने से पहले -प्रोंप्ट

बेहतर तरीका है मैनुअल ट्रंकट

मैनुअल ट्रंकट:

: > /proc/28680/fd/113

या:

> /proc/28680/fd/113

या:

truncate -s 0 /proc/28680/fd/113

का आनंद लें ;)


+1, लेकिन मुझे भी इन कमांड्स को चलाने के लिए sudo की आवश्यकता थी
79E09796

6

यहाँ एक सरल उदाहरण है less:

मान लें कि हमारे पास एक फ़ाइल है my10MBfile:

$ dd if=/dev/zero of=/tmp/my10MBfile bs=1M count=10
10+0 enregistrements lus
10+0 enregistrements écrits
10485760 octets (10 MB) copiés, 0,0454491 s, 231 MB/s

$ ls -l /tmp/my10MBfile
-rw-r--r-- 1 max max 10485760 avril 23 22:49 /tmp/my10MBfile

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9225       4662  67% /

अब मैं उस फ़ाइल को खोलता हूँ less(हाँ, यह एक द्विआधारी फ़ाइल है ... कोई बात नहीं)

$ less /tmp/my10MBfile &

$ lsof -p $(pidof less) | grep 10MBfile
less    29351  max    4r   REG    8,3 10485760 521464 /tmp/my10MBfile

फिर मैं उस फाइल को हटा देता हूं

$ rm /tmp/my10MBfile

$ lsof -p $(pidof less) | grep 10MBfile
less    29351  max    4r   REG    8,3 10485760 521464 /tmp/my10MBfile (deleted)

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9225       4662  67% /

यह अभी भी है, लेकिन हटा दिया गया। Lsof आउटपुट के चौथे कॉलम को देखें: रीडिंग (4r) के लिए फ़ाइल डिस्क्रिप्टिव नंबर 4 खोलें

GDB चलाते हैं!

$ gdb -p $(pidof less)

GNU gdb (GDB) 7.4.1-debian
....
Attaching to process 29351
....

(gdb) p close(4)
$1 = 0
(gdb) q

बस!

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9215       4672  67% /

हमारे 10 एमबी वापस स्वागत है :)

$ ls /proc/29351/fd
0  1  2  3

$ ps 29351
29351 pts/0    S+     0:00 less /tmp/my10MBfile

प्रक्रिया अभी भी चल रही है।


2
ठीक है, लेकिन कब तक? यदि वे अपनी लॉग फ़ाइल में नहीं लिख सकते हैं तो कई प्रक्रियाएँ बस बाहर निकल जाती हैं।
लॉन्गनेक

लोगरोट आपके लिए ऐसा नहीं कर सकता है?
मैक्सएक्सवीडब्ल्यू

logrotate लॉग फ़ाइल को बंद करने और एक नया खोलने के लिए प्रक्रिया को एक सिग्नल भेजता है।
लॉन्गनेक

2

यह आदेश सभी हटाए गए फ़ाइलों को अभी भी सोलारिस सिस्टम पर खुलेगा:

find /proc/*/fd -type f -links 0

आप उन लोगों को बता सकते हैं, जिन्हें आप इस आदेश के साथ चाहते हैं:

:> /proc/p/fd/x

p के साथ प्रक्रिया आईडी और x होने के कारण फ़ाइल डिस्क्रिप्टर पहले कमांड द्वारा वापस आ गया।

चिंता न करें अगर कुछ कार्यक्रमों के साथ रिपोर्ट किया lsगया आकार थोड़ी देर के बाद छंटनी से पहले आकार में बहाल हो जाता है, तो डिस्क पर उपयोग किया जाने वाला वास्तविक आकार बहुत छोटा होगा क्योंकि फ़ाइल अब एक विरल है।


0

आप /proc/<pid>/fdनिर्देशिका में जाने की कोशिश कर सकते हैं और संबंधित फाइल डिस्क्रिप्टर को काट सकते हैं। मान लें कि pd == 123 की हटाई गई फ़ाइल के लिए fd = 3 अंक:

# echo "" >! /proc/123/fd/3

क्या आपके पास एक छूट है जहां यह विधि काम करती है? एफडी को वहां से बदलने का एक तरीका नहीं खोज सकते हैं
21x15 पर अधिकतम

हां, यह काम करता है, लेकिन इस प्रक्रिया का मार्ग कैसे खोजा जाए?
उज्जैन २३'१३

-2

इनमें से किसी भी समाधान ने मेरे लिए काम नहीं किया। ब्लीचबिट को रूट के रूप में उपयोग करने के बाद ही मैं डिलीट की गई फाइल्स से जुड़े स्पेस को ठीक से फ्री कर पाया।

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