পাইপড কমান্ডগুলি কোন ক্রমে চালিত হয়?


89

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

তবে আমি লক্ষ্য করেছি যে লোকেরা যখন পিএস-তে একটি বিশেষ প্রক্রিয়া অনুসন্ধান করে, তখন তারা কমান্ডের শেষে গ্রেপ-ভি "গ্রেপ" অন্তর্ভুক্ত করবে তা নিশ্চিত করার জন্য যে গ্রেপ চূড়ান্ত আউটপুটে প্রদর্শিত না হয়। এর অর্থ পিএক্স অক্স | গ্রেপ "বাশ" | গ্রেপ-ভি "গ্রেপ", যার অর্থ পিএস জানত যে গ্রেপ চলছে এবং তাই পিএস এর আউটপুটে রয়েছে। তবে যদি পিএস এর আউটপুট গ্রেপ-তে পাইপ হওয়ার আগেই শেষ হয়, তবে কীভাবে জানবেন যে গ্রেপ চলছে?

flamingtoast@FTOAST-UBUNTU: ~$ ps | grep ".*"
PID TTY          TIME CMD
3773 pts/0    00:00:00 bash
3784 pts/0    00:00:00 ps
3785 pts/0    00:00:00 grep

কেন একটি উত্তর গ্রহণ করবেন না ?
törzsmókus

উত্তর:


64

পাইপড কমান্ডগুলি একই সাথে চলমান। আপনি যখন চালান ps | grep …, এটি প্রথম ভাগ্যক্রমে প্রথম শুরুর দিকে psবা grepআরম্ভ হয় কিনা এবং কোনও ক্ষেত্রে তারা চালিয়ে যেতে পারে সে সম্পর্কে ড্রয়ের ভাগ্য (বা কর্নেলের অন্তরে গভীর শিডিয়ুল সূক্ষ্ম সুরকরণের সাথে মিলিত শেলের কাজকর্মের বিশদ বিষয়) and একযোগে কার্যকর করা।

প্রথম প্রোগ্রামটি এর কার্যক্রম শেষ হওয়ার আগে, দ্বিতীয় প্রোগ্রামটি প্রথম প্রোগ্রাম থেকে প্রকাশিত হওয়ার সাথে সাথে ডেটা প্রক্রিয়া করার জন্য এটি খুব সাধারণভাবে ব্যবহৃত হয়। উদাহরণ স্বরূপ

grep pattern very-large-file | tr a-z A-Z

grepবড় ফাইলটি অনুসরণ করা শেষ হওয়ার আগে থেকেই বড় হাতের অক্ষরে মিলিয়ে যাওয়া লাইনগুলি প্রদর্শন করা শুরু করে ।

grep pattern very-large-file | head -n 1

প্রথম ম্যাচিং লাইন প্রদর্শন করে এবং grepএর ইনপুট ফাইলটি পড়া শেষ করার আগে প্রক্রিয়াজাতকরণ ভালভাবে বন্ধ হতে পারে ।

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


7
এবং এই উদাহরণটি সম্পর্কে দুর্দান্ত যেটি হ'ল যখন মাথাটি তার প্রয়োজন মতো একটি লাইন পায়, এটি সমাপ্ত হয় এবং গ্রেপ যখন এটি লক্ষ্য করে, এটি কিছুই না করে আরও কাজ না করেও সমাপ্ত হয়।
জো

আমার ধারণা পাইপ সম্পর্কিত কোনও ধরণের আইও বাফার রয়েছে ... আমি কীভাবে জানব যে এর আকার বাইটে? এটি সম্পর্কে আরও জানতে আমি কী পড়তে চাই? :)
n611x007

3
@ নেক্সা আসলে দুটি বাফার রয়েছে। আছে stdio ভিতরে বাফার grepপ্রোগ্রাম, এবং সেখানে একটি বাফার পাইপ নিজেই কার্নেল দ্বারা পরিচালিত হচ্ছে। পরেরটির জন্য, পাইপ বাফারটি কত বড়?
গিলস

49

আদেশগুলি যে আদেশে চালিত হয় তা আসলে কোনও বিষয় নয় এবং এটির গ্যারান্টি নেই। এর রহস্যময় বিবরণ সরাইয়া ছেড়ে যাওয়া pipe(), fork(), dup()এবং execve(), শেল প্রথম নল, ডাটা যে প্রক্রিয়াগুলির মধ্যে প্রবাহিত হবে পয়: প্রণালী তৈরি করে এবং পরে তাদের সাথে সংযুক্ত পাইপ প্রান্ত সঙ্গে প্রসেস সৃষ্টি করে। প্রথম প্রক্রিয়া যা চালিত হয় তা দ্বিতীয় প্রক্রিয়া থেকে ইনপুটটির জন্য অপেক্ষা করতে বা পাইপ থেকে ডেটা পড়া শুরু করার জন্য দ্বিতীয় প্রক্রিয়াটির অপেক্ষায় অবরুদ্ধ হতে পারে। এই অপেক্ষাগুলি নির্বিচারে দীর্ঘ হতে পারে এবং কিছু যায় আসে না। প্রক্রিয়াগুলি যে কোনও ক্রমে চালিত হয়, শেষ পর্যন্ত ডেটা স্থানান্তরিত হয়ে যায় এবং সবকিছু কার্যকর হয়।


5
উত্তম উত্তর, তবে ওপি মনে করে প্রক্রিয়াগুলি ক্রমান্বয়ে চলছে। আপনি এখানে এটি আরও পরিষ্কার করে দিতে পারেন যে প্রক্রিয়াগুলি একই সাথে সঞ্চালিত হয়, এবং পাইপটি হল .... বালতিগুলির মধ্যে একটি পাইপ, যেখানে একই সময়ে (প্রায়।) জল বয়ে যায়।
কিথ

সুস্পষ্ট করার জন্য ধন্যবাদ. যে উত্সগুলি আমি পড়ছি তা দেখে মনে হচ্ছে পাইপযুক্ত প্রোগ্রামগুলি একই সাথে না করে ক্রমান্বয়ে চলছে।
ক্রিয়া_পোটাটো

নির্ধারিত ফ্যাশনে শুরু হওয়া প্রক্রিয়াগুলির অভিজ্ঞতা দেখতে এই 1000 বার চালনার চেষ্টা করুন: প্রতিধ্বনিত>> & 2 | প্রতিধ্বনি <b> & 2
ওলে ট্যাঙ্গ

28

একটি মৃত ঘোড়া মারার ঝুঁকিতে, ভুল ধারণাটি এটি বলে মনে হয়

     | B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর

সমতুল্য

     > অস্থায়ী_ফায়াল 
    বি < অস্থায়ী_ফায়ার 
    আরএম অস্থায়ী_ফায়াল

তবে, যখন ইউনিক্স তৈরি হয়েছিল এবং বাচ্চারা ডাইনোসরগুলিকে স্কুলে চালিত করত, ডিস্কগুলি খুব কম ছিল এবং ফাইল সিস্টেমে সমস্ত ফাঁকা জায়গা ব্যবহার করার পরিবর্তে সৌম্য কমান্ডের পক্ষে এটি প্রচলিত ছিল। যদি এর Bমতো কিছু হয় তবে পাইপলাইনটির চূড়ান্ত ফলাফলটি মধ্যবর্তী ফাইলের চেয়ে অনেক ছোট হতে পারে । অতএব, নল না করার জন্য একটি সাঁটে লেখার হিসাবে উন্নত ছিল, "চালানো একটি প্রথম, এবং তারপর চালানোর বি থেকে ইনপুট সঙ্গে একটি 'র আউটপুট" মডেল, কিন্তু জন্য একটি উপায় হিসেবে সঙ্গে একই সময়ে চালানো এবং অন্তর্বর্তী ফাইল জমা করার জন্য প্রয়োজনীয়তা দূর ডিস্কেgrep some_very_obscure_stringBA


2
এটি উত্তর দেয় কেন এবং তাই আমার ভোট পায়।
লিটল প্রাচীন বন কামি

1

সাধারণত আপনি এটি ব্যাশের অধীনে চালান। প্রক্রিয়াটি কাজ করে এবং একই সাথে শুরু হয় তবে শেল দ্বারা সমান্তরালে চলছে। কিভাবে এটা সম্ভব?

  1. যদি এটি পাইপের শেষ কমান্ড না হয় তবে সকেটের জোড়া দিয়ে নামবিহীন পাইপ তৈরি করুন
  2. কাঁটাচামচ
  3. শিশুদের প্রয়োজনে সকেটগুলিতে স্টিন / স্টডআউটকে পুনরায় নিয়োগ করুন (পাইপ স্টিডিনে প্রথম প্রক্রিয়াটির জন্য পুনরায় নিয়োগ দেওয়া হয় না, শেষ প্রক্রিয়া এবং তার স্টাডআউটের জন্য একই)
  4. শিশু EXEC টি আর্গুমেন্টগুলির সাথে কমান্ড নির্দিষ্ট করে যা মূল শেল কোডটি সরিয়ে দেয় তবে তাদের দ্বারা সমস্ত সকেট খোলা থাকে। শিশু প্রক্রিয়া আইডি পরিবর্তন করা হবে না কারণ এটি একই শিশু প্রক্রিয়া
  5. একসাথে সন্তানের সাথে তবে প্রধান শেলের নীচে সমান্তরাল পদক্ষেপ 1 এ যান।

সিস্টেম কতটা দ্রুত এক্সিকিউট করা হবে এবং নির্দিষ্ট কমান্ড শুরু হবে তা গ্যারান্টি দেয় না। এটি শেলের থেকে স্বাধীন, তবে সিস্টেমের। এই কারণ:

ps auxww| grep ps | cat

একবার grepএবং / অথবা psকমান্ড প্রদর্শন করুন এবং এখনের পরে। এটি নির্ভর করে যে কতক্ষণ দ্রুত কার্নেল সিস্টেম এক্সিকিউট ফাংশন ব্যবহার করে প্রক্রিয়াগুলি শুরু করে।


1
একযোগে কার্যকর করার অর্থ দুটি বা ততোধিক প্রক্রিয়া একই সময়ের ফ্রেমে সম্পাদিত হয় সাধারণত তাদের মধ্যে কিছুটা নির্ভরতা থাকে depend প্যারালাল এক্সিকিউশন মানে দুই বা ততোধিক প্রক্রিয়া একই সাথে চালিত হয় (যেমন একই সময়ে পৃথক সিপিইউ কোরে)। সমান্তরালতা এই প্রশ্নের সাথে প্রাসঙ্গিক নয়, বা "কত দ্রুত" exec()কার্যকর হয় তা নয়, তবে কীভাবে exec()একটি পাইপে প্রোগ্রামগুলির কলগুলি এবং প্রয়োগটি আন্তঃস্তৃত হয়
টমাস নাইম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.