2012-04-04 27 views
5

मेरे पास मेरे/tmp में 8 लाख फ़ाइलें हैं और मुझे उन्हें हटाने की आवश्यकता है। यह सर्वर भी बहुत महत्वपूर्ण ऐप चला रहा है और मैं इसे अधिभारित नहीं कर सकता।बड़ी मात्रा में फ़ाइलों को निकालें

मैं छोटे PHP स्क्रिप्ट का उपयोग कर रहा:

<?php 
$dir = "/tmp"; 
$dh = opendir($dir); 
$i = 0; 
while (($file = readdir($dh)) !== false) { 
    $file = "$dir/$file"; 
    if (is_file($file) && (preg_match("/open/", $file))) { 
    unlink($file); 
    #echo $file; 
    if (!(++$i % 10000)) { 
     echo "$i files removed\n"; 
    } 
    } 
} 
?> 

लेकिन यह मेरी एप्लिकेशन पहुंच योग्य नहीं बनाता है, यहां तक ​​कि साथ: $ ionice -c 3 php ./tmp_files_killer.php $ अच्छा -n 20 php ./ tmp_files_killer.php

मैं अपने स्क्रिप्ट बदल दिया है तो यह/tmp निर्देशिका हर समय नहीं पढ़ा होगा:

$ ls -1 /tmp > tmp_files_list.txt 

<?php 
$file = "tmp_files_list.txt"; 
$infile = fopen($file, "r"); 

while (!feof($infile)) { 
    $line = rtrim(fgets($infile), "\n\r"); 
    if ($line != null){ 
    $file = "$dir/$line"; 
    unlink($file); 
    if (!(++$i % 10000)) { 
     echo "$i files removed\n"; 
    } 
# echo $line + "\n"; 
    } 
} 
?> 

लेकिन इस स्क्रिप्ट भी चल रहा है धीमा मेरा ऐप प्रक्रिया सीपीयू लोड नहीं करता है और मेरे पास पर्याप्त स्मृति है।

दोस्तों, इन फ़ाइलों को कैसे हटाएं?

+0

क्या आप इसे कमांड लाइन पर नहीं कर सकते? क्या आपको उन्हें केवल एक बार, या नियमित अंतराल में हटाना है? शायद एक cronjob बनाने जो नियमित अंतराल पर एक निश्चित मात्रा में फाइलों को हटा देता है। – pritaeas

उत्तर

0

जब मैंने गैलरी के लिए एक अपलोड डीआईआर साफ़ करना चाहता था तो मैंने इस तरह की चीजें कीं। यह वास्तव में लंबा था ... इसलिए मैंने को rm /path/to/clean/* कमांड के साथ कमांड की कोशिश करने का निर्णय लिया और यह वास्तव में तेज़ हो गया।

बहुत साफ नहीं है, लेकिन कम से कम, यह मेरे लिए अच्छा काम करता है।

3

अगर आप सीधे निष्पादित कर सकते हैं linux टर्मिनल पर आदेशों तो यह बहुत ही आसान प्रक्रिया बन जाएगा, सीधे इस आदेश

find /tmp -type f -exec rm -v {} \; 

अतिरिक्त यदि आप तो आप को चलाने के लिए एक cronjob कॉन्फ़िगर कर सकते हैं समय-समय पर इस प्रक्रिया को बाहर ले जाने के लिए चाहते हैं पर अमल मध्यरात्रि में जहां आपका सर्वर लगभग निष्क्रिय होगा

+0

मैं इसे पहले भी कोशिश करूंगा - लेकिन यह अभी भी सर्वर को हथौड़ा कर सकता है। –

+0

ध्यान दें कि इससे उन फ़ाइलों को याद किया जाएगा जिनके नाम पर '.' नहीं है। – sarnold

+1

.. इसके अलावा, '-exec' की आवश्यकता होने की तुलना में एक हजार गुना या अधिक 'execve (2) 'सिस्टम कॉल का कारण बन जाएगा। 'ढूंढें ... -प्रिंट 0 | xargs -0 rm' काफी कम बार 'आरएम' निष्पादित करेगा। और आउटपुट ('-v') सिर्फ अनावश्यक आईओ का कारण बन रहा है, जो अक्सर प्रोग्रामों का सबसे धीमा हिस्सा होता है ... – sarnold

0

क्या php स्क्रिप्ट का उपयोग करके सफाई करने की आवश्यकता है?

यदि नहीं, तो इस article पर एक नज़र डालें ... आप कुछ विचार

4

आप स्क्रिप्ट "मात्रा" में संचालित करने के लिए, तो प्रत्येक हिस्सा के बीच सोने के मिल सकता है मिलना चाहिए।

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

भविष्य में, आपको इस बिंदु पर जाने से रोकने के लिए नियमित रूप से क्रॉन से क्लीनअप नौकरी चलानी चाहिए।

1

मैं इसे एक अलग तरीके से हल करूंगा: एक ही समय में संपूर्ण फाइल सिस्टम को नष्ट कर दूंगा।

एक नया फाइल सिस्टम बनाएं - यह एक साधारण tmpfs फाइल सिस्टम हो सकता है, यह एक फ़ाइल में रहने वाली एक ext2 या ext3 फाइल सिस्टम हो सकती है जो लूपबैक घुड़सवार है, यह एक नई ड्राइव (यूएसबी मेमोरी स्टिक?) हो सकती है।

फिर mv/tmp एक और नाम इंगित माउंट, /tmp पर अपने नए फाइल सिस्टम माउंट, और फिर विभाजन कि /tmp हुआ करता था पर mke2fs चलाते हैं, और खरोंच से एक नया स्वच्छ फाइल सिस्टम लिखें।

एक बार अपने पुराने tmp डिवाइस फिर से बनाया है, तो आप फिर से चरणों को पूरा कर सकते हैं - mv /tmp /new-tmp, /tmp, पर डेटा, mount फिर से स्वरूपित डिवाइस वापस कि लगातार होना चाहिए बंद प्रतिलिपि बनाएँ, और डेटा है कि ऐसा करना चाहिए वापस कॉपी जारी रहती है।

0

यह शायद तेजी से अभी भी मानक तरीका/tmp के तहत सभी फाइलों को दूर करने के लिए है:

find /tmp -type f -exec rm {} + 
ग्नू खोजने के साथ

, इस हो सकता है थोड़ा तेज:

find /tmp -type f -delete 

हैं/tmp पर है इसके अपनी फाइल सिस्टम, बस अनमाउंट करें और इसे mkfs करें। अगर यह tmpfs है, तो बस रीबूट करें।

संबंधित मुद्दे