cat / dev / null> file.log ডারউইনে বড় ফাইল কেটে দেয় না


15

অতীতে, লিনাক্স সিস্টেমে, আমি বড়, ওপেন লগ ফাইলগুলি (যে কোনও ফাইল যা সক্রিয়ভাবে একটি প্রক্রিয়া দ্বারা সক্রিয়ভাবে লেখা হচ্ছে) কেটে ফেলতে সক্ষম হয়েছি cat /dev/null > file.log

যাইহোক, ১০.৯ (ম্যাভারিক্স) এ বিষয়টি মনে হয় না। আমি একটি 11 জিবি ফাইল পেয়েছি যা একটি অ্যাপ্লিকেশন দ্বারা লগ করা হচ্ছে, কিন্তু যখন আমি একই ফাইলটি এই ফাইলটির সাথে করব তখন কিছুই হবে বলে মনে হচ্ছে না।

আমি যখন তুচ্ছ আকারের কোনও ফাইলটিতে এটি চেষ্টা করি, এটি কার্যকর হয়।

এখানে 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

@ মাইকেল আমি সৌজন্য হিসাবে লাইসেন্সটি অন্তর্ভুক্ত করেছি ... আপনি নোট করবেন যে আমি বেশিরভাগটিই আবার redacted করেছি।
chb

1
লাইসেন্সটি একটি বিভ্রান্তি, এখানে সত্য
রত্নটির

উত্তর:


12

cat /dev/nullকোনও আউটপুট উত্পাদন করে না এমন কমান্ড লেখার জন্য এটি কিছুটা বিশৃঙ্খলাবদ্ধ is :বা trueআরও সুস্পষ্ট।

এর সব মিলিয়ে cat /dev/null > file, : > file, এবং এমনকি > fileসবচেয়ে শাঁস এ, শেল stdout- এ তে O_TRUNC সাহায্যে ফাইল খোলে, তারপর যা আউটপুট না কিছু, তারপরে ফাইলটিকে বন্ধ করে কেটে ছেড়ে দেওয়া হয় না অ্যাপ্লিকেশন চালায়।

তবে সেক্ষেত্রে বা truncateসিস্টেম কলটি ব্যবহার করার সময় , ফাইলটি পূরণ করার প্রক্রিয়াটি যদি ও_এপিপেন্ড পতাকা ব্যবহার করে না খোলায়, পরের বার এটি ফাইলের বিবরণীতে ফাইলটি খোলার পরে লিখবে, এটি লিখবে অফসেটে থাকা ডেটা ফাইলের মধ্যেই ছিল।

কারণ এইচএফএস + স্পার্স ফাইলগুলিকে সমর্থন করে না, তার মানে এই যে অফসেটের আগে থাকা স্থানটি পুনরায় স্থানান্তর করতে হবে এবং সিস্টেমটিকে জিরো দিয়ে পূরণ করতে হবে।

সুতরাং, আপনাকে সেই অ্যাপ্লিকেশনটি কেটে ফেলতে হবে যা সেই ফাইলটিতে এটি ছাঁটাই করার আগে লিখছে। অথবা আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অ্যাপ্লিকেশনটি ফাইলটি শেল পুনর্নির্দেশের সাহায্যে খোলে 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

এখন আমার শেলের এফডি 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 বাইট বড়

অন্যদিকে, সাথে:

$ 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 বাইট বড় এবং এটি একটি বাইট ধরে রাখতে প্রয়োজনীয় স্থান নেয় space


1
আমি এই উত্তর থেকে অনেক কিছু শিখেছি। ধন্যবাদ।
chb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.