cat / dev / null> file.log डार्विन में बड़ी फाइल को नहीं काटती है


15

अतीत में, लिनक्स सिस्टम पर, मैं बड़ी, खुली लॉग फाइल (यानी, एक ऐसी फ़ाइल जो सक्रिय रूप से एक प्रक्रिया द्वारा लिखी जा रही है) का उपयोग करके काट-छाँट करने में सक्षम है cat /dev/null > file.log

हालाँकि, 10.9 (Mavericks) पर, ऐसा प्रतीत नहीं होता है। मुझे एक 11GB फ़ाइल मिली है जिसे एक एप्लिकेशन द्वारा लॉग किया जा रहा है, लेकिन जब मैं उक्त फाइल के साथ एक ही कमांड करता हूं, तो कुछ भी नहीं होता है।

जब मैं तुच्छ आकार की फ़ाइल पर यह कोशिश करता हूं, तो यह काम करता है।

यहाँ है ls -l /dev/null:

crw-rw-rw- 1 root wheel 3, 2 Dec 16 12:49 /dev/null

मैंने भी cp /dev/null file.logकोई फायदा नहीं हुआ।

यह सोचकर कि मैं ट्रंकट फ़ंक्शन ( man 2 truncateडार्विन में) का लाभ उठा सकता हूं, मैंने इसे संकलित किया और इसे दो फाइलों, एक तुच्छ आकार का और दूसरा वास्तविक लॉग फाइल के खिलाफ चलाया। फिर से, इसने तुच्छ फ़ाइल के खिलाफ काम किया और बहुत बड़े लॉग पर काम नहीं किया।

/*
 * Copyright (c) 2013 Thomas de Grivel <thomas@lowh.net>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 ...
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <unistd.h>

int main (int argc, const char **argv)
{
        int e = 0;
        while (--argc) {
                argv++;
                if (truncate(*argv, 0)) {
                        e = 4;
                        warn("%s", *argv);
                }
        }
        return e;
}

इस प्रक्रिया की 0परवाह किए बिना कि मैं किस फ़ाइल का उपयोग करता हूं।


तुम्हें कैसे पता कि यह काम नहीं किया? क्या कहता duया du -hकहता है? क्या यह संभव है कि फ़ाइल एक विरल फ़ाइल है?
मिकेल

2
इसके अलावा, इस पोस्ट में लाइसेंस शामिल करने का क्या उद्देश्य है? यह केवल शोर जोड़ने वाला प्रतीत होता है।
मिकेल

du -h /tmp/file.logपरिणाम11G /tmp/file.log
chb

@ मायिकेल ने लाइसेंस को एक शिष्टाचार के रूप में शामिल किया ... आप ध्यान दें कि मैंने इसे सबसे ज्यादा रिडक्ट किया।
chb

1
लाइसेंस एक व्याकुलता है, यहाँ सही रत्न है उत्तर
iruvar

जवाबों:


12

cat /dev/nullएक कमांड लिखने का एक तरीका है, जो आउटपुट नहीं है। :या trueअधिक स्पष्ट हैं।

सभी में cat /dev/null > file, : > fileऔर यहां तक > fileकि अधिकांश गोले में, शेल स्टडआउट पर O_TRUNC के साथ फ़ाइल खोलता है, फिर एप्लिकेशन चलाता है जो कुछ भी आउटपुट नहीं करता है, फिर फ़ाइल बंद हो जाती है और छोड़ी जाती है।

हालाँकि, उस स्थिति में या truncateसिस्टम कॉल का उपयोग करते समय , यदि उस फ़ाइल को भरने वाली प्रक्रिया ने इसे O_APPEND ध्वज के साथ नहीं खोला है, तो अगली बार जब यह फ़ाइल डिस्क्रिप्टर पर लिखता है, तो यह फ़ाइल पर खुलता है, यह लिखेगा ऑफसेट पर डेटा यह फ़ाइल के भीतर था।

क्योंकि HFS + विरल फाइलों का समर्थन नहीं करता है, इसका मतलब है कि इससे पहले की जगह को फिर से भरना और सिस्टम द्वारा शून्य से भरना होगा।

इसलिए, आपको उस एप्लिकेशन को मारना होगा जो उस फ़ाइल को लिखने से पहले उसे ट्रंक कर रहा है। या आपको यह सुनिश्चित करने की आवश्यकता है कि एप्लिकेशन फ़ाइल को खोलता है O_APPEND(जैसे >>कि शेल पुनर्निर्देशन का उपयोग करके)।

यदि आप इसके साथ प्रयोग करना चाहते हैं:

$ exec 3> x
$ yes | head -n 50000 >&3
$ ls -ls x
200 -rw-r--r--  1 me me  100000 Dec 16 21:32 x

अब मेरे शेल का fd 3 फ़ाइल के भीतर 100000 बाइट्स है

$ : > x
$ ls -ls x
0 -rw-r--r--  1 me me  0 Dec 16 21:34 x

अब फ़ाइल काट दी जाती है (आकार 0, डिस्क पर कोई स्थान नहीं है)।

$ echo >&3
$ ls -ls x
200 -rw-r--r--  1 me me  100001 Dec 16 21:34 x

100000 ऑफसेट पर फ़ाइल को 1 बाइट लिखना, फ़ाइल अब 100001 बाइट्स है, पहले वाले सभी शून्य, HFS + पर 100k से अधिक का उपयोग करेंगे, लेकिन अधिकांश अन्य यूनिक्स फ़ाइल सिस्टम में लगभग एक डिस्क ब्लॉक

दूसरी ओर, साथ:

$ exec 3>> x
$ yes | head -n 50000 >&3
$ ls -ls x
200 -rw-r--r--  1 me me  100000 Dec 16 21:35 x
$ : > x
$ echo >&3
$ ls -ls x
8 -rw-r--r--  1 me me  1 Dec 16 21:36 x

फ़ाइल पर 1 बाइट लिखना 100000 पर ऑफसेट नहीं है, लेकिन फ़ाइल के अंत में होने के कारण O_APPEND। फ़ाइल 1 बाइट बड़ी है, और उस बाइट को रखने के लिए आवश्यक स्थान लेता है।


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