যাঁদের একটি প্রোগ্রাম রয়েছে যা নিয়মিত স্টডআউটে লিখছে, তাদের আপনাকে কেবল 'একক ম্যাচ' বিকল্পটি গ্রেপ করার জন্য পাইপ করা উচিত। গ্রেপ একবারে মিলে যাওয়ার স্ট্রিংটি খুঁজে পেলে এটি প্রস্থান করবে যা গ্রেপ-তে পাইপ করা প্রক্রিয়ায় স্টাডাউট বন্ধ করে দেয়। এই ইভেন্টটি উচিত স্বাভাবিকভাবেই প্রোগ্রাম অত্যন্ত শৃঙ্খলার থেকে প্রস্থান করার জন্য কারণ তাই যতদিন প্রক্রিয়া আবার লিখেছেন ।
কী ঘটবে তা হ'ল গ্রেপ বন্ধ হয়ে যাওয়ার পরে যখন ক্লোজড স্টডআউটে লেখার চেষ্টা করবেন তখন প্রক্রিয়াটি একটি সিগপাইপ পাবে। এখানে পিংয়ের সাথে একটি উদাহরণ রয়েছে যা অন্যথায় অনির্দিষ্টকালের জন্য চলবে:
$ ping superuser.com | grep -m 1 "icmp_seq"
এই কমান্ডটি প্রথম সফল 'পং'-এর সাথে মিলবে এবং তারপরে পরের বার ping
স্টাডআউটে লেখার চেষ্টা করবে exit
যাহোক,
এটি সর্বদা গ্যারান্টিযুক্ত নয় যে প্রক্রিয়াটি আবার স্টডআউটে লিখবে এবং তাই কোনও সাইনপাইপ উত্থাপিত হতে না পারে (উদাহরণস্বরূপ, লগ ফাইলের টেলিংয়ের সময় এটি ঘটতে পারে)। এই দৃশ্যের জন্য আমি যে সর্বোত্তম সমাধানটি পরিচালনা করতে পেরেছি তা হ'ল একটি ফাইল লেখার সাথে জড়িত; আপনি যদি উন্নতি করতে পারেন বলে মনে করেন তবে মন্তব্য করুন:
$ { tail -f log_file & echo $! > pid; } | { grep -m1 "find_me" && kill -9 $(cat pid) && rm pid; }
এটি ভেঙে:
tail -f log_file & echo $! > pid
- কোনও ফাইলকে লেজ দেয়, ব্যাকগ্রাউন্ডে প্রক্রিয়া সংযুক্ত করে এবং পিআইডি ( $!
) একটি ফাইলে সংরক্ষণ করে । পরিবর্তে আমি পিআইডি র পরিবর্তে একটি চলকটিতে রফতানি করার চেষ্টা করেছি, তবে মনে হয় এখানে এবং যখন পিআইডি আবার ব্যবহৃত হয় তখন একটি রেসের শর্ত রয়েছে।
{ ... ;}
- এই কমান্ডগুলি একসাথে গ্রুপ করুন যাতে আমরা বর্তমান প্রসঙ্গটি রাখার সময় আউটপুটটিকে গ্রেপ করতে পাইপ করতে পারি (ভেরিয়েবলগুলি সংরক্ষণ এবং পুনরায় ব্যবহার করার সময় সহায়তা করে তবে সেই অংশটি কাজ করতে সক্ষম হইনি)
|
- পাইপ বাম পাশের stdout থেকে ডান পাশের স্টিডিনে
grep -m1 "find_me"
- লক্ষ্য স্ট্রিং সন্ধান করুন
&& kill -9 $(cat pid)
- বল বধ (SIGKILL) tail
প্রক্রিয়া পর grep
প্রস্থানের একবার এটি ম্যাচিং স্ট্রিং খুঁজে বের করে
&& rm pid
- আমরা তৈরি ফাইলটি সরান
tail -f
কোনও প্রোগ্রামের ফলাফলের পাশাপাশি একটি ফাইলের পক্ষে এটি সম্ভব হয়েছিল ... আমি কি ভুল করছি?