পুনঃনির্দেশের স্ট্রিমিং আউটপুট কেটে যাবে কীভাবে?


1

আমার একটি প্রক্রিয়া রয়েছে যা প্রতিটি অগ্রগতি আপডেটের জন্য একটি লাইন আউটপুট করে (সিডনোট: এটি লাইনটি পরিষ্কার / প্রতিস্থাপন করে, কোনও খাঁটি নিউলাইন ব্রেক নেই)।

আমি এই প্রক্রিয়াটির সর্বশেষতম লাইনটি একটি আউটপুট ফাইলে সংরক্ষণ করতে চাই বা আকারকে পরিচালনাযোগ্য রাখতে আউটপুট ফাইলটি কেটে ফেলতে চাই।

এই মুহুর্তে আমার কাছে genrtr > genrtr.log এবং ক্রোন দিয়ে আমি ব্যবহার করার চেষ্টা করেছি > genrtr.logতবে এটি কার্যকর হয় না। এছাড়াও সহায়তা rm genrtr.logকরে না কারণ প্রক্রিয়াটি ফাইল আপডেট করা বন্ধ করে দেয়।

আমি বুঝতে পারি যে সেগুলি কেন কাজ করে না, তবে কীভাবে এটি পুনর্গঠন করা যায় তাই এটি আমার প্রয়োজনের সাথে খাপ খায় wonder

চেষ্টা করা হয়েছে genrtr | sed -ne '$w genrtr.log'তবে ফাইলটিতে লেখার আগে প্রক্রিয়াটি শেষ হওয়ার জন্য এটি অপেক্ষা করে।

স্পেসিফিকেশন: প্রক্রিয়াটি প্রতি 1 সেকেন্ডে আউটপুট উত্পাদন করে এবং সার্ভার ক্রাশ না করলে প্রক্রিয়াটি চিরকাল চলতে থাকবে।


আসলে কি genrtr? আপনি এটি সম্পাদনা করতে পারেন?
টেরডন

এটি সি তে লিখিত একটি প্রোগ্রাম যা আমি সম্পাদনা করতে পারি তবে সি সম্পর্কে প্রায় কোনও জ্ঞান নেই এবং রক্ষণাবেক্ষণের উদ্দেশ্যে আমি এতে গণ্ডগোল করব না।
সেভ

সম্ভবত লোগ্রোটেট আপনাকে সাহায্য করতে পারে? আমার এটির সাথে পর্যাপ্ত অভিজ্ঞতা নেই, তাই আপনি যা খুঁজছেন তা আমি জানি না।
অগ্নি

উত্তর:


0

আমি ভাবছিলাম রানের ফ্রিকোয়েন্সি কী? ....

লগফাইলে আউটপুট পুনর্নির্দেশের জন্য টি চেষ্টা করুন, এটির একটি ইউটিলিটি প্রায়শই স্ট্রিমের একটি অনুলিপি তৈরি করতে ব্যবহৃত হয় এবং সেই অনুলিপিটিকে আউটপুট ফাইলে পুনঃনির্দেশিত করে

use : 
  command | tee command_result.log 

আপনি একটি মোড়ক স্ক্রিপ্টে একটি মনিটর ফাংশন রাখতে পারেন যা এই প্রোগ্রামটিকে অনুরোধ করে যা কিছু অন্তর্বিজ্ঞানের পরে শীর্ষ 10 লাইন মুছে ফেলবে ....... এইভাবে আপনার লগ ফাইলটি কয়েক কেবি-র চেয়ে বেশি পাবেন না

এছাড়াও যদি আপনার মাঝে অপ্রয়োজনীয় স্পেস থাকে তবে অনুবাদ করার জন্য "টিআর" ইউটিলিটি ব্যবহার করতে পারে ... উদাহরণস্বরূপ:

Nitin@Kaizen ~
$ df -h | head -1
    Filesystem      Size  Used Avail Use% Mounted on

Nitin@Kaizen ~
$ df -h | head -1 | tr -s ' '
    Filesystem Size Used Avail Use% Mounted on   *** note the squeeze in space 

আশাকরি এটা সাহায্য করবে


আমি টি সম্পর্কে জানতাম না, তবে >প্রক্রিয়া চলাকালীন এটি ডেটা যুক্ত করার সময় একই রকম প্রভাব ফেলবে বলে মনে হয় , যখন আমি > command_result.logফাইলটি প্রভাবিত না করি।
সেভ

টি কি করে তা হ'ল এটি স্ট্রিমটির সদৃশ করে তবে এখানে এটি সহায়তা করতে পারে: কমান্ড | te lofile 2> & 1> / dev / null .... এইভাবে আপনি লগের একটি পৃথক অনুলিপি পাবেন যা আপনি আপনার র‍্যাপার স্ক্রিপ্টে ব্যবহারযোগ্য তথ্যগুলি বের করতে ব্যবহার করতে পারেন .... বা যাই হোক না কেন, দেব / নাল একটি বিশেষ ফাইলটি অবিরাম বাড়বে .... সুতরাং আপনার স্থান সমস্যাটিও এইভাবে পরিচালিত হয়।
নিতিন

0

আপনি চেষ্টা করতে পারেন এমন কয়েকটি জিনিস রয়েছে। সবচেয়ে সহজ হ'ল ফাইলের শেষ লাইনগুলি মুদ্রণ করুন:

tail genrtr.log

তারপরে, প্রক্রিয়াটি শেষ হয়ে গেলে লগ ফাইলটি মুছুন। আরেকটি বিকল্প হ'ল সময়-সময়ত ফাইলটি ওভাররাইট করা।

  • পটভূমিতে প্রক্রিয়াটি চালু করুন:

    genrtr > genrtr.log &
  • লগফিলের বিষয়বস্তু মুছে ফেলুন:

    echo > genrtr.log

ফাইলটি এখন কাটা হয়েছে তবে এটি আপডেট হওয়া অবিরত থাকবে gentrতাই পরবর্তী আপডেট প্রতিবেদনটি এতে লেখা হবে। আপনি এটি স্বয়ংক্রিয় করতে পারেন, উদাহরণস্বরূপ, যদি এটি 1MB এর চেয়ে বড় হয় তবে ফাইল কেটে ফেলা:

while true; 
  do if [ $(stat -c%s genrtr.log) -gt 1000000 ]; then 
    tail genrt.log > /tmp/foo && cat /tmp/foo > genrt.log; 
     fi;
done

আপনি এটি থামিয়ে না দেওয়া পর্যন্ত এই ছোট স্ক্রিটলেটটি চলবে ( while true;), এবং যতবারই জেনার্টআরলগ এক এমবি এর চেয়ে বড় হবে, এটি শেষ কয়েকটি লাইন রেখে দেবে এবং বাকী ফাইলটি মুছবে।


হালনাগাদ:

স্কট নীচে সঠিকভাবে নির্দেশিত হিসাবে, যদি আপনার আউটপুটটি \rলাইনটি সাফ করার জন্য থাকে তবে tailআশানুরূপভাবে কাজ করবে না। এটি অবশ্য করা উচিত:

while true; 
  do if [ $(stat -c%s genrtr.log) -gt 1000000 ]; then 
    tail genrt.log | perl -pe 's/.+\r(.+)/$1\n/' > /tmp/foo && cat /tmp/foo > genrt.log; 
     fi;
done

পার্ল কমান্ড সর্বশেষের আগে সবকিছু মুছে ফেলে \rএবং শেষ "লাইন" মুদ্রণ করে (এর পরে ডেটা \rএবং একটি নতুন লাইন।


দুর্ভাগ্যক্রমে `>` পুনর্নির্দেশ প্রক্রিয়া চলমান থাকাকালীন লক্ষ্য ফাইলে কোনও পরিবর্তন করার অনুমতি দেয় বলে মনে হয় না এবং genrtrচিরকাল চলবে run
সেভ

1
@ ইটারডন: প্রশ্নটি বলেছে যে প্রোগ্রামটি নতুন বার্তাগুলির সাহায্যে আপডেট বার্তাগুলি শেষ করে না, বরং পর্দার একই লাইনটি মুছতে এবং পুনরায় ব্যবহার করতে পলায়ন ক্রমগুলির সাথে রয়েছে। আপনি কি বিশ্বাস করেন যে tailসেই ইনপুটটির সাথে বুদ্ধিমান আচরণ করবে? (হতে পারে tail -400c, শেষ 400 অক্ষর পেতে এবং আশা করি যে এটি কমপক্ষে সর্বশেষ পাঁচটি লাইন।)
স্কট

1
@ শেভ: মনে হচ্ছে আমরা যোগাযোগ করতে ব্যর্থ হচ্ছি। আপনি কি বলছেন যে, আপনি যদি টাইপ করেন genrtr > genrtr.logতবে আউটপুটটি এখনও স্ক্রিনে আসে এবং genrtr.logখালি থাকে? যদি তাই হয় তবে টাইপ করলে কী হয় genrtr 2> genrtr.log?
স্কট

genrtr > genrtr.logস্ক্রিনে আউটপুট প্রদর্শন করে না, এটি আউটপুটটিকে সঠিকভাবে ফাইলে পুনর্নির্দেশ করে, তবে প্রক্রিয়া চলাকালীন, আপনি ফাইলটি সফলভাবে সংশোধন করতে পারবেন না (চেষ্টা করেছেন > genrtr.logএবং অনুরূপ) আমি চেষ্টা করেছি genrtr 2> genrtr.logএবং এটি প্রাথমিকের শীর্ষস্থানীয় তথ্য পাঠ্য সংরক্ষণ করে ফাইলে আউটপুট, তবে মূল পুনরাবৃত্তি অগ্রগতি আপডেট পাঠ্য পরিবর্তে স্ক্রিনে প্রদর্শিত হবে।
সেভ

@ শেভ: বেলডলি, সুপার ব্যবহারকারীকে স্বাগতম আপনার তথ্যের জন্য, আপনি যখন কোনও মন্তব্যে প্রতিক্রিয়া জানালেন (নতুন মন্তব্যে) তখন লেখকটির নাম "@ স্কট" এর মতো "@" এর আগে উল্লেখ করা প্রচলিত। সেভাবেই তাকে অবহিত করা হয়। আপনি সংক্ষিপ্ত করতে পারেন, এবং আপনি "@ জর্জ, @ স্কট" হিসাবে একাধিক নাম উল্লেখ করতে পারেন। দেখুন মন্তব্যে প্রত্যুত্তর দেওয়া অনুচ্ছেদ মন্তব্য বিন্যাস অধ্যায় Markdown সম্পাদনা সহায়তা পৃষ্ঠার।
স্কট

0

আমি বিশ্বাস করি যে genrtrc কোনও নতুন প্রোগ্রাম পরিবর্তন বা লিখিত না করে এটি করা খুব জটিল হতে চলেছে । যদি আপনি পরে কাজটি করতে আরও স্বাচ্ছন্দ্য বোধ করেন তবে আমি এই রূপরেখার পরামর্শ দিই:

int   c;
FILE  *fp;

fp = fopen(লগ_ফাইলে , "w");
if (fp == NULL) (ত্রুটিগুলি হ্যান্ডল করা)
while ((c = getc()) != EOF)
{
    putchar(c);
    if (c ==অব্যাহতি ক্রম যা একটি লাইন শেষ করে আপনার)
    {
        fflush(fp);     // সম্ভবত এখানেও ত্রুটিগুলি পরীক্ষা করা উচিত।
        rewind(fp);
    }
    else
        putc(c, fp);
}

এই সংমিশ্রণ মত কাজ করে teeএবং tail- স্ট্যান্ডার্ড ইনপুট পড়া, এবং স্ট্যান্ডার্ড আউটপুট এবং একটি ফাইলে এটা লেখার - পার্থক্য এটি ফাইলের মধ্যে শুধুমাত্র গত লাইন রাখে না। তাহলে আপনি দৌড়াবেন

genrtr |the_above_program

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