2012-08-29 5 views
5

एक्सेस नहीं किया जा रहा है, तो फ़ाइल हटाएं, मुझे लॉग इन फाइलों को हटाने की आवश्यकता है, लेकिन एक संभावना है कि हटाए जाने के समय उन्हें एक्सेस किया जा रहा है। पहुंचने के द्वारा, मेरा मतलब है कि एक प्रक्रिया या तो फ़ाइल को पढ़ या लिख ​​रही है। ऐसे मामलों में, मुझे इसे हटाने के बजाय फ़ाइल को छोड़ना होगा। इसके अलावा मेरा सर्वर लिनक्स और PHP अपाचे पर चल रहा है।अगर वर्तमान में

<?php 
$path = "path_to_log_file"; 
$log_file = "app.log"; 
if(!being_accessed($log_file)) 
{ 
    unlink($path.$log_file); 
} 
?> 

अब मेरे सवाल है कि कैसे मैं being_accessed परिभाषित कर सकते हैं:

मैं क्या देख रहा हूँ (in pseudo-code) करने के लिए कुछ इसी तरह है? मुझे पता है कि PHP भाषा में सीधे भाषा कार्य नहीं हो सकता है। मैं flocklast_access_time तरह वर्गों के संयोजन का उपयोग बारे में सोच रहा (शायद?) और (लेकिन यह केवल उन परिस्थितियों जहां फ़ाइल flock एक्सेस आवेदन के द्वारा एड था में उपयोगी है)

कोई सुझाव/अंतर्दृष्टि का स्वागत करते हैं ...

+0

आप "एक्सेस किए जा रहे" फ़ाइल को कैसे परिभाषित करते हैं? –

+0

एक प्रक्रिया हो सकती है या तो इसे पढ़ना, या इसे लिखना .. –

+1

लिनक्स पर कोई फर्क नहीं पड़ता, फ़ाइलों को वास्तव में तब तक हटाया नहीं जाएगा जब तक कि सभी फ़ाइल पॉइंटर्स बंद नहीं हो जाएंगे। – SirDarius

उत्तर

6

सामान्य रूप से आप प्रशासन अधिकारों के बिना इसे खोजने में सक्षम नहीं होंगे (यानी lsof जैसे टूल चलाने में सक्षम होने के लिए यह देखने के लिए कि आपकी सूची सूचीबद्ध है या नहीं। लेकिन यदि आपकी स्क्रिप्ट लिनक्स/यूनिक्स सर्वर पर चल रही हैं (जो अधिकांश होस्टर्स के लिए मामला है) तो आपको परेशान करने की आवश्यकता नहीं है, क्योंकि फाइल सिस्टम इसका ख्याल रखेगा। इसलिए उदाहरण के लिए, आपको 1 जीबी फ़ाइल मिली है और कोई इस फ़ाइल को डाउनलोड कर रहा है। फ़ाइल को हटाने के लिए यह सुरक्षित है 012,या किसी अन्य तरीके से) घटना अगर वह डाउनलोडर अभी शुरू हुआ है और यह उसकी डाउनलोडिंग में हस्तक्षेप नहीं करेगा, क्योंकि फाइल सिस्टम जानता है कि फ़ाइल पहले से ही खुली है (कुछ प्रक्रियाओं में हैंडल है) तो यह केवल इसे चिह्नित करेगा, invisible दूसरों के लिए कहें (इसलिए एक बार आप फ़ोल्डर सामग्री को सूचीबद्ध करने का प्रयास करते हैं, अब आप उस फ़ाइल को नहीं देख पाएंगे, लेकिन यदि आपकी फ़ाइल काफी बड़ी है तो आप उपलब्ध डिस्क स्पेस को जांचने का प्रयास कर सकते हैं (यानी df के साथ, यह देखने के लिए कि अभी भी कब्जा कर लिया जाएगा)) लेकिन हैंडल को बनाए रखने वाले लोग अभी भी इसका उपयोग करने में सक्षम होंगे। एक बार जब सभी प्रक्रियाएं अपनी हैंडल फ़ाइल बंद कर देती हैं तो उन्हें मीडिया और डिस्क स्पेस से भौतिक रूप से हटा दिया जाएगा। तो जब आवश्यक हो तो बस अनलिंक करें। आप unlink चेतावनी फेंक सकता है के बारे में परेशान है, तो बस किसी चेतावनी के इस कॉल के क्रम में फेंक कर सकते हैं निष्क्रिय करने के लिए @ चिह्न (@unlink()) के साथ अपने कॉल पहले जोड़ें

+0

के रूप में खोला जाएगा, क्या इस तरह के मामलों में डिलीट अवरुद्ध हो जाएगा? जैसा कि एक प्रक्रिया में लूप में एक प्रक्रिया लिख ​​रही है, और इसके खिलाफ एक डिलीट कॉल है .. जब तक लेखन प्रक्रिया समाप्त नहीं हो जाती है तब तक हटाएं ब्लॉक? –

+1

नहीं 'अनलिंक' तत्काल वापस कर दिया जाएगा, जैसे कि कोई भी उस फ़ाइल का उपयोग नहीं कर रहा है। –

+0

मैं जो कर रहा हूं उसके लिए बिल्कुल सही लगता है, धन्यवाद! –

1

आप बस अपने कोड को बदल देंगे (जो विंडोज पर एक भी मामला हो) इस तरह से (यदि आप इसे बार-बार कर रहे हैं):

<?php 
$path = "path_to_log_file"; 
$log_file = "app.log"; 
@unlink($path.$log_file); 

सूचना @ मामले में एक त्रुटि फ़ाइल हटाने-योग्य नहीं है से बचने के लिए, और (टैग समाप्त होने की कमी टैग न खत्म होने वाली आम त्रुटियों के स्रोत हैं और ऐसा करना चाहिए से बचा जा सकता है)

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