লগফাইলে কীভাবে শেষ 50 টি লাইন রাখবেন


22

আমি আমার ফাইলটিতে সর্বশেষ 50 টি রেখা রাখার চেষ্টা করি যেখানে প্রতি মিনিটে আমি তাপমাত্রা সঞ্চয় করি। আমি এই আদেশটি ব্যবহার করেছি:

tail -n 50 /home/pi/Documents/test > /home/pi/Documents/test

তবে ফলাফলটি খালি পরীক্ষার ফাইল। আমি ভেবেছিলাম, এটি টেস্ট ফাইলের শেষ 50 টি লাইন তালিকাভুক্ত করবে এবং পরীক্ষার ফাইলটিতে এটি সন্নিবেশ করবে। আমি যখন এই আদেশটি ব্যবহার করি:

tail -n 50 /home/pi/Documents/test > /home/pi/Documents/test2

এটা ঠিক কাজ করছে। টেস্ট 2 ফাইলটিতে 50 টি লাইন রয়েছে।

কেউ আমাকে বোঝাতে পারেন সমস্যা কোথায়?


2
Rrdtool এর মতো কিছু সময়ের সাথে N রেকর্ডগুলি রাখতে (অন্যান্য পরিসংখ্যানগুলির মধ্যে) আরও উপযুক্ত হতে পারে।
ট্রিগার করুন


2
ক্লাসিক
কাটা

আপনি যদি লগগুলি তৈরি করতে পাইথন ব্যবহার করেন তবে আপনার loggingমডিউলটি দেখে নেওয়া উচিত
ওয়েন ওয়ার্নার

উত্তর:


30

সমস্যাটি হ'ল আপনার শেল কমান্ডগুলি চালানোর আগে কমান্ড পাইপলাইন স্থাপন করছে। এটি "ইনপুট এবং আউটপুট" এর বিষয় নয়, ফাইলের বিষয়বস্তু লেজ এমনকি চালানোর আগেই চলে গেছে। এটি এমন কিছু যায়:

  1. শেল >লেখার জন্য আউটপুট ফাইলটি কেটে দেয়, এটি কেটে দেয়
  2. সেই আউটপুটটির জন্য ফাইল-বর্ণনাকারী 1 (স্টাডাউটের জন্য) ব্যবহার করার জন্য শেলটি সেট আপ করে
  3. খোলটি কার্যকর করে tail
  4. tailদৌড়ে, খোলে /home/pi/Documents/testএবং সেখানে কিছুই খুঁজে পায় না

বিভিন্ন সমাধান রয়েছে, তবে কীটি সমস্যাটি বোঝা যাচ্ছে তা আসলে কী ভুল হচ্ছে এবং কেন।

এটি আপনি যা সন্ধান করছেন তা উত্পাদন করবে,

echo "$(tail -n 50 /home/pi/Documents/test)" > /home/pi/Documents/test

ব্যাখ্যা:

  • $() কমান্ড সাবস্টিটিউশন বলা হয় যা কার্যকর করে tail -n 50 /home/pi/Documents/test
  • উদ্ধৃতি চিহ্ন আউটপুট লাইন বিরতি সংরক্ষণ করে।
  • > /home/pi/Documents/testecho "$(tail -n 50 /home/pi/Documents/test)"একই ফাইলে আউটপুট পুনঃনির্দেশ করে ।

ধন্যবাদ এটি ভাল কাজ করে! আমার আরও একটি প্রশ্ন আছে. আপনার পদ্ধতিটি কীভাবে ধাপে ধাপে কাজ করে তা দয়া করে ব্যাখ্যা করতে পারেন?
dorinand

1
তবে আপনার ক্ষেত্রে বাশ প্রথমে> পারফর্ম করে না কেন? বাশ কমান্ডটি কীভাবে প্রেরণ করে তা আমি বুঝতে পারি না। কেউ কি ব্যাখ্যা করতে পারেন?
dorinand

1
ইকো কমান্ডে>> থাকে, সুতরাং ইকো কমান্ডটি কার্যকর হলে এটি কার্যকর করা হয়। এটি লেখার আগে এটি কার্যকর করা শুরু করতে পারে না। ভেরিয়েবল প্রতিস্থাপন হ'ল কমান্ডটি লিখে। এটি নেস্টেড কমান্ড চালায় এবং ভ্যালুতে প্রতিস্থাপন করে ইকো কমান্ড তৈরি করে।
জুলবার্ক

আমি যখন 50 জি এর পরিবর্তে 5000 লাইন ব্যবহার করে 44 জিবি লগ ফাইলের জন্য একইটি ব্যবহার করার চেষ্টা করেছি তখন আমি ত্রুটি পেয়েছিbash: xrealloc: cannot allocate 18446744071562067968 bytes
Carmageddon

8

প্রথমে ফাইলটি সাফ করার জন্য ফাইল পুনঃনির্দেশের আর একটি সমাধান হ'ল প্যাকেজ spongeথেকে moreutilsএমনভাবে ব্যবহার করা :

tail -n 50 /home/pi/Documents/test | sponge /home/pi/Documents/test

6

এটি হ'ল বাশ >প্রথমটি পুনর্নির্দেশের প্রক্রিয়া করে , ফাইলের বিষয়বস্তু মুছে দেয়। তারপরে এটি কমান্ডটি কার্যকর করে। আপনি যদি ব্যবহার করতে চান >>তবে শেষ 50 টি রেখাগুলি বর্তমানে ফাইলটিতে রয়েছে তার শেষে যুক্ত হবে। এই ক্ষেত্রে, আপনার একই 50 টি লাইন দু'বার পুনরাবৃত্তি হবে।

কমান্ডটি অন্য কোনও ফাইলে পুনর্নির্দেশের সময় প্রত্যাশা মতো কাজ করে। একই নামের একটি ফাইলে কোনও ফাইলের শেষ 50 টি লাইন লেখার একটি উপায় এখানে রয়েছে:

tail -50 /home/pi/Documents/test > /home/pi/Documents/test2 && mv /home/pi/Documents/test2 /home/pi/Documents/test

এটি প্রথমে একটি অস্থায়ী ফাইলে সর্বশেষ 50 টি লাইন লিখেছে, যা mvমূল ফাইলটি প্রতিস্থাপনের জন্য ব্যবহার করে সরানো হয়েছে।

মন্তব্যে উল্লিখিত হিসাবে, ফাইলটি এখনও খোলা থাকলে এটি কাজ করবে না। ফাইলটি সরানো একটি নতুন ইনোড তৈরি করে এবং মালিকানা এবং অনুমতিগুলি পরিবর্তন করতে পারে। অস্থায়ী ফাইল ব্যবহার করে এটি করার আরও ভাল উপায় হ'ল:

tail -50 /home/pi/Documents/test > /home/pi/Documents/test2 ; cat /home/pi/Documents/test2 > /home/pi/Documents/test

অস্থায়ী ফাইলটিও সরানো যেতে পারে, যদিও প্রতিটি সময় এটির বিষয়বস্তু ওভাররাইট করা হবে।


ধন্যবাদ. আপনি কি দয়া করে আমাকে ধাপে ধাপে ব্যাখ্যা করতে পারেন কোন বাশটি কার্যকর করে? এটি কীভাবে কাজ করে তা আমি ভাবতে পারি না।
ডোরিনান্দ

tail -50 /home/pi/Documents/test >/tmp/foo && cat /tmp/foo >/home/pi/Documents/test
স্টিভ

1
মনে রাখবেন যে লগফিলটি এখনও লগিং প্রক্রিয়া দ্বারা খোলা থাকলে (এটি মূল, মুছে ফেলা ফাইলটিতে লগিং চালিয়ে যাবে) যদি এটি কাজ করে না। টেম্পাইল ফাইল + সরানোর ফলে একটি নতুন ইনোড আসে (যে কোনও হার্ড-লিঙ্কগুলি ভেঙে), এবং সম্ভবত পৃথক পৃথক মালিক বা পার্মস। tail ... > temp ; cat temp > orig ; rm -f tempকাজ করে।
কাস

4

যেহেতু আপনি শেল পুনঃনির্দেশের সাথে মুখ্য সমস্যাটি দেখেছেন তাই ফাইলের শেষ 50 টি লাইনে ছাঁটাই করার বিকল্প উপায় এখানে রয়েছে:

file=/path/to/the/file
n=$(( $(wc -l < "$file") - 50 ))
[[ $n -gt 0 ]] && sed -i 1,${n}d "$file"

কঠোর পরিশ্রমটি (জিএনইউ) -i"ইন-প্লেস এডিটিং" বৈশিষ্ট্য সহকারে করেছে , যা একটি অস্থায়ী ফাইলে আউটপুট তৈরি করে কভারগুলির নিচে কাজ করে। বাকি লাইনগুলি সেডের অপারেশনের জন্য গণিত সেট আপ করে, যথা:

  1. ( wc) ফাইলটিতে লাইনগুলি গণনা করুন , তারপরে 50 বিয়োগ করুন; এটি বরাদ্দ করুন n
  2. যদি n ইতিবাচক হয় তবে 1 এর মাধ্যমে n এর মাধ্যমে মুছে ফেলতে সেড কমান্ডটি চালান।

4
printf '%s\n' '1,$-50d'   w | ed -s /home/pi/Documents/tes

printfমধ্যে পাইপ কমান্ড (প্রতি লাইন এক) ব্যবহার করা হয় ededকমান্ডের বর্ণনা দেয়া হলঃ

  • 1,$-50d - শেষ 50 টি লাইন বাদে সমস্ত মুছুন
  • w - পরিবর্তিত ফাইলটি ডিস্কে ফিরে লিখুন

কোনও পুনর্নির্দেশ জড়িত নেই, সুতরাং শেল আউটপুট ফাইলটি পড়ার আগে ওভাররাইট করতে পারে না।

এছাড়াও, "ইন-প্লেস" সম্পাদনার বেশিরভাগ ফর্মের বিপরীতে (যা সাধারণত কোনও টেম্প ফাইল তৈরি করে তারপরে মূল নামটির পরিবর্তে "ইন-প্লেস" সম্পাদনা অনুকরণ করে) edআসলে আসল ফাইলটি সম্পাদনা করে - তাই এটি একই ইনোডকে রাখে ( এবং মালিক, গোষ্ঠী এবং অনুমতি - টেম্পাইল ফাইল + এমভি সর্বদা ইনোড পরিবর্তন করবে এবং পরিস্থিতি অনুসারে অন্যদের পরিবর্তন করতে পারে )।


4

কিছুটা ভিন্ন ট্র্যাকের উপর, আপনি logrotate(8)নিয়মিত লগ ফাইলগুলি বর্ধিতভাবে নামকরণ করা ফাইলগুলিতে ব্যাক আপ করতে পারেন এবং তারপরে পুরানোগুলি মুছতে পারেন।

এইভাবে প্রধান সিস্টেম লগ ফাইলগুলি তাদের দীর্ঘ বৃদ্ধি থেকে রোধ করতে পরিচালিত হয়।

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