আমি এমন একটি ডিভাইস ড্রাইভার লিখছি যা রিং বাফার dmesg আউটপুটে ত্রুটি বার্তা প্রিন্ট করে । আমি আউটপুট দেখতে চাই dmesgএটি পরিবর্তন হিসাবে।
কিভাবে আমি এটি করতে পারব?
আমি এমন একটি ডিভাইস ড্রাইভার লিখছি যা রিং বাফার dmesg আউটপুটে ত্রুটি বার্তা প্রিন্ট করে । আমি আউটপুট দেখতে চাই dmesgএটি পরিবর্তন হিসাবে।
কিভাবে আমি এটি করতে পারব?
উত্তর:
তুলনামূলকভাবে সাম্প্রতিক dmesgসংস্করণগুলি একটি ফলো বিকল্প ( -w, --follow) সরবরাহ করে যা আনুগত্যিকভাবে কাজ করে tail -f।
সুতরাং, কেবল নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
$ dmesg -wH
( -H, --humanরঙ, আপেক্ষিক সময়ের মতো ব্যবহারকারী-বান্ধব বৈশিষ্ট্যগুলিকে সক্ষম করে)
এই বিকল্পগুলি ফেডোরা 19-তে উদাহরণস্বরূপ উপলব্ধ।
-H
-wইউটোপিক (14.10) এর পরে উবুন্টুর প্রতিটি সংস্করণে কাজ করা উচিত। ( লঞ্চপ্যাড.এন.উবুন্টু
আপনি watchঠিক কমনটি ব্যবহার করতে পারেন যা ঠিক এই জাতীয় জিনিসগুলির জন্য উদ্দেশ্যে করা হয়
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
$((LINES-6))অংশ এটি আপনার টার্মিনাল মধ্যে চমত্কারভাবে মাপসই করা উচিত।
watch। সুতরাং এটি আমন্ত্রণের মধ্যে সত্যই পরিবর্তন হবে না dmesg। একজনকে এমন একটি মোড়ক ব্যবহার করা দরকার যা টার্মিনাল অবস্থার প্রশ্ন করবে।
watch, সুতরাং ঘড়িটি সেখানে ভেরিয়েবল এক্সপ্রেশন সহ কমান্ডটি কার্যকর করবে, যা শেলটি চালিত করে এটি প্রসারিত হবে। প্রতি বার. এটি চেষ্টা করুন, এটি কাজ করে।
watchব্যবহারগুলি popen(), যার অর্থ অন্য শেল তৈরি হয়েছে এবং পরিবেশের পরিবর্তনশীল তার পরে সরবরাহ করা হবে (এবং এভাবে প্রতিটি এক্সিকিউটিভ রানের উপর আপডেট হয়)। ভাল লাগছে।
আপনি সত্যই dmesgসরাসরি আউটপুট নিরীক্ষণ করতে পারবেন না ।
তবে, সম্ভাবনা বেশি যে আপনার মডিউলটি সরাসরি ডেমসগের রিং-বাফারে মুদ্রণ করছে না, তবে পরিবর্তে কার্নেল লগিং সুবিধাগুলি ব্যবহার করে (যা পরে প্রদর্শিত হবে dmesg)। যদি আপনার syslogকিছু বুদ্ধিমান (যেমন ডিফল্ট) সেটিংস থাকে তবে সম্ভবত এই বার্তাগুলি kern.logলগফাইলে প্রদর্শিত হবে।
সুতরাং আপনি যেমন কিছু করতে পারেন:
tail -f /var/log/kern.log
/var/log/kern.logমোটামুটি লিনাক্স-নির্দিষ্ট। ওপেনবিএসডি (এবং সম্ভবত অন্যদের) জন্য ডেমসগ স্টাফগুলি / var / লগ / বার্তাগুলিতে লগ ইন হয়। মঞ্জুর, অন্য কিছু জিনিস সেখানে যায় goes
tail -f /var/log/{messages,kernel,dmesg,syslog}সুপারউজারের
আপনি dmesgকার্নেলের লগ বার্তা পেতে ব্যবহার করেন।
কার্নেল নিজেই একটি রিং বাফারে লগইন করে, যেমন কেবল স্মৃতিতে। এখন সমস্ত dmesgকিছুই সেই রিং বাফারের সামগ্রীর আউটপুট। আপনি যদি dmesg -cএটি করেন তবে পরে রিং বাফারটিও মুছবেন।
সুতরাং আপনি while true; do dmesg -c; sleep 1; doneকাজ না করার সমতুল্য মতো কিছু পাওয়ার মতো কিছু করতে পারেন dmesg|tail। তবে এটি রিং বাফারটিকে মুছে ফেলে এবং সুতরাং মূল শক্তির প্রয়োজন।
অন্য উপায়টি হ'ল ফাইল /proc/kmsgযা রিং বাফারে একটি ভিউকে অনুমতি দেয়। আপনি করতে পারেন tail -f /proc/kmsg, তবে এটি কেবলমাত্র একটি প্রক্রিয়ার জন্য অনুমোদিত এবং এটি সাধারণত আপনার লগিং ডেমন। - এটি বার্তাটি পড়ার এবং এটিকে আসল ফাইলগুলিতে (সাধারণত / var / লগতে) লিখতে হয় যেখানে সেগুলি পড়তে পারে। এটি সমস্ত বার্তাকে একটি ফাইলে বা বিভিন্ন অংশে বিভিন্ন ফাইলে আউটপুট করার জন্য কনফিগার করা যেতে পারে। (তবে কনফিগারেশন আপনার সিস্টেমের লগিং ডেমনের উপর নির্ভর করে))
সুতরাং /var/logআপনার প্রয়োজন অনুসারে এমন কোনও ফাইল রয়েছে কিনা তা একবার দেখুন এবং অন্যথায় আপনার লগিং ডেমনটি কনফিগার করেছেন।
আপনি যদি এমবেডেড সিস্টেম ব্যবহার করেন তবে ওপেনডব্লিউআরটি-র মতো সিস্টেমে ব্যস্তবক্সে খুব সীমিত কার্যকারিতা রয়েছে এবং কেবল ২-৩ টি ফ্ল্যাগ সমর্থিত।
ইভেন্টগুলি পরিবর্তনের সাথে সাথে আপনি যদি স্ক্রিনে ডেমসগ আউটপুট ক্রমাগত মুদ্রণের একটি দ্রুত এবং নোংরা উপায় চান, তবে একটি সরল বাশ লুপ কাজ করে। এটি আদর্শ নয় তবে আমি যেমন উল্লেখ করেছি ব্যাসিবক্স ডেমসগে প্রচুর ফাংশন অনুপস্থিত। কমান্ড লাইনে প্রবেশ করার পরে আমি নিম্নলিখিতগুলির একই প্রভাব পেয়েছি:
$ while true; do dmesg -c ; sleep 1 ; done
আপনি সিআরটিএল-সি দিয়ে লুপটি ছাড়তে পারেন স্লিপ 1 হ'ল এটি অকারণে সিপিইউতে ব্যাটারি থামানো, এবং -সি পতাকা প্রতিটি কলটিতে বাফার সাফ করে দেয় যাতে আপনি প্রতি সেকেন্ডে বারবার আউটপুট দেখতে না পান,
যে সিস্টেমে systemdআপনি ব্যবহার করেন সেগুলিতে আপনি এটিও করতে পারেন:
# journalctl -kf
পৃথক টার্মিনালগুলি থেকে এই 2 টি কমান্ড ব্যবহার করুন:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtএটি অনুরূপ ফলাফল অর্জন করবে।