পাইপড কমান্ড চলাকালীন লিনাক্স ইউটিলিটিগুলি কি স্মার্ট?


23

আমি কেবলমাত্র একটি টার্মিনালে কয়েকটি কমান্ড চালাচ্ছি এবং আমি ভাবতে শুরু করি, ইউনিক্স / লিনাক্স পাইপড কমান্ডগুলি চালনার সময় শর্টকাট নেয়?

উদাহরণস্বরূপ, ধরা যাক আমার কাছে দশ মিলিয়ন লাইনযুক্ত একটি ফাইল রয়েছে, যার মধ্যে প্রথম 10 টি রয়েছে hello world। আপনি যদি কমান্ডটি চালনা grep "hello world" file | headকরেন তবে 10 টি লাইন পাওয়া মাত্রই প্রথম কমান্ডটি থামবে না, বা এটি পুরো ফাইলটি প্রথমে অনুসন্ধান চালিয়ে যেতে পারে?


2
যে কারণে gnu গ্রেপের -mযুক্তি রয়েছে।
পল টমলিন

3
এটির সাথে টার্মিনালের কোনও সম্পর্ক নেই। পাইপড কমান্ডগুলি শেল দ্বারা পরিচালিত হয়।
কিথ থম্পসন

@ কিথথম্পসন আমার অজ্ঞতা ক্ষমা করুন, আমি পরিভাষা সম্পর্কে বড় নই, এটিকে টার্মিনাল, শেল বা কমান্ড লাইন বলব কিনা তা নিশ্চিত ছিল না। আমার প্রশ্নের সম্পাদনাগুলি নির্দ্বিধায় মনে করুন :)
অসন্তুষ্ট গোট

উত্তর:


30

প্রকার, রকম. শেলটির কোনও ধারণা নেই যে আপনি যে কমান্ডগুলি চালাচ্ছেন সেগুলি কী করবে, এটি কেবল একটির আউটপুটটিকে অন্যটির ইনপুটকে সংযুক্ত করে।

যদি grep"হ্যালো ওয়ার্ল্ড" বলে 10 টিরও বেশি লাইন খুঁজে পাওয়া যায় তবে headতার 10 টি লাইন এটি চাইবে এবং পাইপটি বন্ধ করে দেবে। এটি grepএকটি SIGPIPE দিয়ে হত্যা করতে পারে, সুতরাং এটি খুব বড় ফাইল স্ক্যান করা চালিয়ে যাওয়ার প্রয়োজন হবে না।


2
সুতরাং আমার ধারণা, রেসের অবস্থার কারণে, গ্রেপ ইতিমধ্যে 11 তম বা 12 তম প্যাটার্নটি পড়ে থাকতে পারে, তবে সম্ভবত 100 হাজার নয়?
ব্যবহারকারী অজানা

3
এটি লাইনগুলির দৈর্ঘ্য এবং পাইপের বাফারের আকারের উপর নির্ভর করে, তবে সংক্ষিপ্ত উত্তরটি হ'ল গ্রেপ মেরে যাওয়ার আগে কিছুটা যুক্তিসঙ্গতভাবে সীমিত পরিমাণে অতিরিক্ত ডেটা পড়বে।
ডিএমকে

1
@ ইউসারুননড, হুবহু
psusi

কুল, আমি জানতাম না যে ঘটনাটি ঘটেছে। আমি ভেবেছিলাম grep/dev/null
ডিসেম্বর

15

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

আপনার উদাহরণে, যা ঘটেছিল তার একটি সময়রেখা এখানে দেওয়া হয়েছে:

  • grepএবং headকমান্ড সমান্তরাল আরম্ভ।
  • grep কিছু ইনপুট পড়ে, এটি প্রক্রিয়া শুরু করে।
  • কিছু ক্ষেত্রে, grep আউটপুট প্রথম অংশ উত্পাদন করে।
  • head প্রথম অংশটি পড়ে তা লিখে ফেলে।
  • প্রথম 10 ম্যাচের পরে যথেষ্ট লাইন রয়েছে বলে ধরে নেওয়া (অন্যথায় grepপ্রথমে শেষ হতে পারে), অবশেষে headপছন্দসই সংখ্যক রেখা মুদ্রণ করা হবে। এই মুহূর্তে,head প্রস্থান।
  • grepএবং headপ্রক্রিয়াগুলির আপেক্ষিক গতির উপর নির্ভর করে grepকিছু ডেটা জমে থাকতে পারে এবং এখনও এটি মুদ্রিত হয়নি। সময় headপ্রস্থান করে,grep ইনপুট পড়তে বা অভ্যন্তরীণ প্রক্রিয়াকরণ করা হতে পারে এটি এটি চালিয়ে যেতে থাকবে।
  • শীঘ্রই grepএটি প্রক্রিয়াকৃত ডেটা লিখবে। এই মুহুর্তে, এটি একটি স্বাক্ষর গ্রহণ করবে এবং মারা যাবে।

এটি সম্ভবত grepকঠোরভাবে প্রয়োজনের তুলনায় কিছুটা ইনপুট প্রক্রিয়া করবে, তবে সাধারণত কয়েকটি কিলোবাইট:

  • head সাধারণত কয়েক কিলোবাইটের অংশে পড়ে (কারণ এটি জারির চেয়ে আরও কার্যকর read প্রতিটি বাইটের জন্য সিস্টেম কল দেওয়ার - এই আচরণটি বাফারিং বলে) তাই কাঙ্ক্ষিত শেষ লাইনের পরে শেষ অংশের অংশটি বাদ দেওয়া হয়।
  • ট্রানজিটে কিছু ডেটা থাকতে পারে, যেহেতু পাইপগুলিতে কার্নেল দ্বারা পরিচালিত একটি সম্পর্কিত বাফার থাকে (প্রায়শই 512 বাইট)। এই ডেটা বাতিল করা হবে।
  • grepআউটপুট অংশ হতে পারে এমন কিছু ডেটা জমে থাকতে পারে (আবার বাফারিং)) এটির আউটপুট বাফারটি ফ্লাশ করার চেষ্টা করার পরে এটি SIGPIPE পাবেন।

সমস্ত সিস্টেমে সমস্তই সুনির্দিষ্টভাবে তৈরি করা হয়েছে যাতে ফিল্টারিং ইউটিলিটিগুলি প্রাকৃতিকভাবে দক্ষতার সাথে আচরণ করে। তাদের আউটপুট চ্যানেলটি মারা যাওয়ার পরে যে প্রোগ্রামগুলি চালিয়ে যাওয়া দরকার তাদের অবশ্যই সিগপাইপ সিগন্যাল উপেক্ষা করার পদক্ষেপ নিতে হবে।


3

বাছাই, পাইপলাইনটি এইভাবে কাজ করে: এটি প্রথমে আপনার প্রথম কমান্ড এবং তারপরে দ্বিতীয় কমান্ড কার্যকর করে।

যে, A|Bদেওয়া আদেশ দেওয়া যাক। তারপর এটি অনিশ্চিত কিনা AবাB প্রথম শুরু হয়। একাধিক সিপিইউ থাকলে তারা ঠিক একই সময়ে শুরু হতে পারে। একটি পাইপ একটি অপরিজ্ঞাত তবে সীমাবদ্ধ পরিমাণের ডেটা ধরে রাখতে পারে।

বি যদি পাইপ থেকে পড়ার চেষ্টা করে তবে কোনও ডেটা উপলব্ধ Bনা হয়, ডেটা না আসা পর্যন্ত অপেক্ষা করবে। যদি Bকোনও ডিস্ক থেকে পড়া হয়, Bএকই সমস্যা হতে পারে এবং ডিস্ক পড়া শেষ না হওয়া পর্যন্ত অপেক্ষা করা প্রয়োজন। আরও কাছাকাছি সাদৃশ্যটি একটি কীবোর্ড থেকে পড়া হবে। সেখানে, Bকোনও ব্যবহারকারী টাইপ করার জন্য অপেক্ষা করতে হবে। তবে এই সমস্ত ক্ষেত্রে বি একটি "পঠিত" অপারেশন শুরু করেছে এবং এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে। তবে যদি Bকোনও কমান্ড এমন হয় যে Aনির্দিষ্ট পয়েন্ট যেখানে Bs এর ইনপুট স্তরটি পৌঁছেছে তার পরে কেবলমাত্র এর আংশিক আউটপুট প্রয়োজনA সাইনপাইপ দ্বারা হত্যা করা হবে

যদি Aপাইপে লেখার চেষ্টা করে এবং পাইপটি পূর্ণ থাকে তবে Aঅবশ্যই পাইপের কোনও কক্ষটি নিখরচায় অপেক্ষা করতে হবে। Aএটি যদি কোনও টার্মিনালে লিখত তবে একই সমস্যা হতে পারে। একটি টার্মিনালটিতে প্রবাহ নিয়ন্ত্রণ থাকে এবং এটি ডেটার গতি নিয়ন্ত্রণ করতে পারে। যে কোনও ইভেন্টে, Aএটি "লিখন" অপারেশন শুরু করেছে এবং রাইট অপারেশন শেষ না হওয়া পর্যন্ত অপেক্ষা করবে।

Aএবং Bসহ-প্রক্রিয়া হিসাবে আচরণ করছে, যদিও সমস্ত সহ-প্রক্রিয়াগুলি পাইপের সাথে যোগাযোগ করবে না। উভয়ই অন্যটির পুরো নিয়ন্ত্রণে নেই।


1
প্রশ্নটি হল: "বি পাইপটির পাশটি বন্ধ করে দিলে এ কী করবে?"
এনজোটিব

2
এটা কি 'ভাঙা পাইপ' হবে না?
প্যাটকোস সিসাবা

1
যদি কোনও প্রোগ্রাম একটি বন্ধ পাইপ থেকে / থেকে / যেমন পড়ার চেষ্টা করে (উদাহরণস্বরূপ headপ্রস্থান করে), প্রোগ্রামে একটি SIGPIPE সংকেত দেখা দেয় এবং ডিফল্ট আচরণটি প্রস্থান করতে হয়।
লেকেনস্টেইন

কিভাবে এই প্রশ্নের উত্তর দেয়? দেখে মনে হয় সুসির উত্তরটি সংক্ষিপ্ততর এবং আরও বেশি।
jw013

1

grepপাইপের সরাসরি নিয়ন্ত্রণ নেই (এটি কেবল ডেটা গ্রহণ করছে), এবং পাইপের সরাসরি নিয়ন্ত্রণ নেই grep(এটি কেবল ডেটা প্রেরণ করছে) ...

grep, বা অন্য কোনও প্রোগ্রাম কী করে তা সম্পূর্ণভাবে সেই প্রোগ্রামগুলির অভ্যন্তরীণ যুক্তি নির্ভর করে। আপনি যদি grepকমান্ড লাইন বিকল্পের মাধ্যমে যদি তাড়াতাড়ি বেরোন-যখন খুঁজে পাওয়া যায় সেগুলি করার জন্য বলুন, তা না হলে এটি প্যাটার্নটির সন্ধান করে ফাইলটির একেবারে শেষ পর্যন্ত ছুড়ে যাবে ...

টার্মিনালটি একইভাবে অভ্যন্তরীণ কাজগুলি grepএবং shellপাইপিংয়ের ক্রিয়াগুলি থেকে বেশ বিচ্ছিন্ন হয়ে পড়েছে ... টার্মিনালটি মূলত একটি লঞ্চিং প্যাড এবং আউটপুট প্রদর্শন ...

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