ক্রমান্বয়ে দুটি শিশু প্রক্রিয়া তৈরি করতে আমি কোন আদেশগুলি ব্যবহার করব?


8

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

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


আপনি কি পাইথন ব্যবহারের জন্য উন্মুক্ত?
xrisk

3
আপনি কীভাবে "এর বাস্তবায়নের নির্দিষ্ট পয়েন্ট" নির্ধারণ করেন তা না জেনে এটি অত্যন্ত অস্পষ্ট।
মারু

@ মুরু স্পষ্ট করতে সম্পাদিত
w.brian

সুতরাং আপনার আসলে 3 টি প্রক্রিয়া দরকার। 1. রান, আউটপুট তৈরি; ২. এর আউটপুট নিরীক্ষণ করে এবং একটি নির্দিষ্ট সময়ে শুরু হয় ৩. আপনি যা তৈরি করছেন তা তৈরি করতে এটি যথেষ্ট তথ্য। তবে এটি কোনও প্রোগ্রাম ডিজাইন করার ভাল উপায় নয়।
djsmiley2kStaysInside

উত্তর:


7

আপনি এর xargsজন্য ইউটিলিটিটি ব্যবহার করতে পারেন । এটি স্টিডিনে প্রতিটি লাইনের জন্য একটি কমান্ড চালাতে পারে, সুতরাং আমাদের কেবল xargsকমান্ডটি শুরু করার সময় স্টিডিনে একটি লাইন ইনপুট হিসাবে পাওয়া যায় তা নিশ্চিত করা দরকার grep: এটি দিয়ে সম্পন্ন করা যায় :

proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2

আর্গুমেন্ট --max-count=1, --max-lines=1এবং --no-run-if-emptyনিশ্চিত যে proc2শুরু হয় ঠিক যদি এবং যখন একবার proc1আউটপুট ${targetString}প্রথমবারের জন্য, এবং কখনও যদি proc1কখনো আউটপুট ${targetString}--replaceএড়াতে যে xargsতার কমান্ড লাইন ইনপুট লাইন appends।

এটি পরীক্ষা করার জন্য আমি নিম্নলিখিত কমান্ড লাইনটি ব্যবহার করেছি:

(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"

1
+1 এটি একটি খুব সৃজনশীল উত্তর। এটি প্রোকে 1 থেকে আপনার যদি বাকি আউটপুট প্রয়োজন হয় তবে তা আরও জটিল হয়ে উঠবে। আপনার টি এবং অতিরিক্ত ফাইল বর্ণনাকারী বা নামযুক্ত পাইপগুলির মতো জিনিসগুলি ব্যবহার করতে হবে।
জো

7

আমি নিশ্চিত নই যে আপনি জিজ্ঞাসিত প্রশ্নের একটি মার্জিত কমান্ড / উত্তর রয়েছে (অর্থাত্ এটি কার্যকর করার একটি নির্দিষ্ট পয়েন্টে পৌঁছাবেন) - তবে এমন কোনও সরঞ্জাম / কৌশল রয়েছে যা সমাধান সমাধানে ব্যবহার করতে পারে, সম্ভবত এর মধ্যে 1 টিরও বেশি জড়িত নিম্নলিখিতগুলি এবং সম্ভবত অন্যান্য জিনিসগুলি যা আমি এখনও জানি না:

  1. পটভূমি প্রক্রিয়াগুলি (&)
  2. শর্তসাপেক্ষ কার্যকর (&& এবং ||)
  3. ঘুম
  4. অপেক্ষা করুন (আমি আশা করি এটি বিশেষভাবে কার্যকর হবে - আপনি যদি পটভূমিতে 1 টিরও বেশি কাজ শুরু করেন তবে সমস্ত কাজ শেষ না হওয়া পর্যন্ত এটি অপেক্ষা করবে)
  5. নামযুক্ত পাইপ (যা প্রক্রিয়াগুলির মধ্যে কথা বলার একটি ব্যবস্থা সরবরাহ করতে পারে)।
  6. inodenotifywait

লক ফাইলগুলি লেখা ও পরীক্ষা করাও একটি সাধারণ অনুশীলন (প্রোপস টিপ - আপনার যদি পরিবেশের নিয়ন্ত্রণ থাকে তবে / টিএমপি-র পরিবর্তে র্যামডিস্কে লিখুন - এটি অনেকগুলি ডিস্ট্রো / / ডিএম / এসএমএস)।


6

এটি কেবল একটি ধারণা, তবে প্রথম প্রক্রিয়াটির আউটপুট গ্রেপ করতে পাইপ রয়েছে। গ্রেপ পাইপকে তার আউটপুটটিকে একটি পঠন লাইনের লুপের সাথে রাখুন এবং প্রতিটি লাইনকে আপনি যা খুঁজছেন তার সাথে তুলনা করুন। একবার পাওয়া গেলে, প্রো 2 চালনা করুন।

#!/bin/bash
targetString="line you are looking for"
proc1 | grep "${targetString}" |
while read line
do
if [ "$line" = "${targetString}" ]; then
    proc2
fi
done

যদি "এর কার্যকর করার একটি নির্দিষ্ট পয়েন্ট" নির্ধারণ stdoutকরা যায় তবে নিম্নলিখিতগুলি সম্পর্কে কীভাবে?

proc1 | grep "stdout trigger string" && proc2

&&grepপ্রত্যাবর্তনের সময় গুলি চালানো উচিত 0, এটি যখন কোনও মিল খুঁজে পায় কেবল তখনই ঘটে।


1
স্টিডিন বন্ধ না হওয়া পর্যন্ত গ্রেপ চলতে থাকবে। এটি ততক্ষণ কোনও কিছুই (0 বা অন্যথায়) ফিরিয়ে দেবে না।
বব

@ Bob ওহ, আপনাকে ধন্যবাদ ... আমি এই ধারণাটি পুনর্বিবেচনার চেষ্টা করব।
লুই ওয়াওয়ারু

@bob এটি বিশেষত অগোছালো এবং ছদ্মবেশযুক্ত এবং সরঞ্জামটির অপব্যবহার হবে তবে আপনি লগ ফাইলটি (যেমন কোনও ফাইলের পাইপ স্টাডাউট) নিরীক্ষণ করতে ব্যর্থ 2ban ব্যবহার করতে পারেন, এবং সেই লাইনটি থাকলে দ্বিতীয় স্ক্রিপ্টটি কার্যকর করার নিয়ম প্রোগ্রাম করুন পাওয়া গেছে (তবে আমি একটি ট্রিগার ফাইলটি পুনরায় সংশোধন এবং ইনোটাইফাই ব্যবহার করা আরও মার্জিত সমাধান)
ডেভিডগো

1
যদি প্রো 1 টি আউটপুটে একাধিকবার টার্গেটস্ট্রিং ঘটে তবে প্রোপ 2 একাধিকবার চালানো হবে। আপনি যদি proc2 &এবং তারপরে breakএটি করেন তবে তা ঘটবে না, তবে এটি পাইপটি বন্ধ করে দেবে এবং অকস্মতভাবে 1 টি বন্ধ করে দেবে। বিকল্পভাবে, আপনি একবার প্র্যাক 2 শুরু হয়ে গেলে একটি পতাকা সেট করতে পারেন এবং এটি ব্যবহার করে আবার প্র্যাক 2 চালিত হবে না তা নিশ্চিত করতে এটি ব্যবহার করতে পারেন। অন্য উত্তরের মতো, বাকী প্রো 1 টি আউটপুট বাতিল করা হয়েছে, সুতরাং আপনার যদি এটির প্রয়োজন হয় তবে আরও কাজ করা প্রয়োজন।
জো

1
@ জো গুড পয়েন্ট মূল প্রশ্নটি আসলে কেবল কমান্ডগুলির সাথে কাজ করার জন্য উপলব্ধ ছিল সে সম্পর্কেই জিজ্ঞাসা করছিল, সুতরাং এটি কেবলমাত্র একটি উত্তর যা এই কমান্ডের কিছু সম্ভাবনা (মূলত |এবং grepএখানে) প্রদর্শিত করে।
লুই ওয়াওয়ারু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.