স্ক্রিপ্ট দ্বারা তৈরি সমস্ত শিশু প্রক্রিয়ার তালিকা কীভাবে পাবেন


9

প্রসঙ্গ:

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

#exaple of blocking script
echo "START"
first_program 
second_program 
echo "DONE"

বা নন-ব্লকিং টাইপ অর্থাত্ পটভূমিতে শিশু প্রক্রিয়া কাঁটাচামচ করে এমন কিছু থেকে বেরিয়ে আসে

#example of non-blocking script
echo "START"
first_program &
second_program &
echo "DONE"

আমি কী অর্জন করার চেষ্টা করছি?

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

কোনও স্ক্রিপ্ট কার্যকর করার মাধ্যমে উত্পন্ন সমস্ত শিশু প্রক্রিয়ার পিআইডি-র তালিকা পেতে পারি এমন কোন উপায় আছে কি? যে কোনও পয়েন্টার বা ইঙ্গিতগুলি অত্যন্ত প্রশংসা করবে


আমি মনে করি না পিতামাতার স্ক্রিপ্ট শেষ হওয়ার পরে এটি সম্ভব হবে যদি না আপনি পিতামাতার পিআইডি ক্যাপচার করতে পারেন। আপনি যদি স্ক্রিপ্টগুলি চালু করেন তবে আপনি সেগুলিকে এমন কিছুতে মুড়িয়ে রাখতে পারেন pid$(foo.sh; echo $!)যা আপনাকে পিআইডি দেয় foo.shযাতে আপনি ব্যবহার করতে পারেন ps --ppid। কাজ করবে?
টেরডন

2
স্ক্রিপ্টগুলি কি লেখকের ব্যবহারকারীর ইউআইডি-র অধীনে চলতে হবে? যদি তা না হয় তবে আপনি কি এই উদ্দেশ্যে একটি ডমি ব্যবহারকারী তৈরি করতে পারেন? আপনার এমনকি প্রয়োজন হবে না grep, ঠিক ps –udummy_user। এছাড়াও, প্রক্রিয়া গ্রুপগুলি দেখুন।
স্কট

আপনার প্রাথমিক প্রশ্নের সমাধানের চেয়ে এটি আরও এক ধরণের কাজের সমাধান: একটি নতুন বাশ সেশন খুলুন। আপনি psকোনও শর্ত ছাড়াই এই শেলটি থেকে তৈরি সমস্ত প্রক্রিয়া তালিকাভুক্ত করতে পারেন (কেবল bashএবং psশুরুতে হওয়া উচিত )। সেখানে আপনার স্ক্রিপ্ট শুরু করুন। এটি সমাপ্ত হওয়ার পরে, ps | wc -lআপনার প্রত্যাশিত মান পৌঁছানো পর্যন্ত অপেক্ষা করুন ।
টিম

উত্তর:


8

আপনার প্রশ্নের সরাসরি উত্তর দিতে, আদেশ দিন

jobs -p

আপনাকে সমস্ত শিশু প্রক্রিয়াগুলির তালিকা দেয়।

বিকল্প # 1

তবে আপনার ক্ষেত্রে কেবল waitকোনও প্যারাম ছাড়াই কমান্ডটি ব্যবহার করা সহজ হতে পারে :

first_program &
second_program &
wait

সমস্ত শিশু প্রক্রিয়া শেষ না হওয়া পর্যন্ত এটি অপেক্ষা করবে ।

বিকল্প # 2

অন্য বিকল্পটি হ'ল $!শেষ প্রোগ্রামটির পিআইডি পেতে এবং সম্ভবত কোনও ভেরিয়েবলে জড়ো হতে পারে:

pids=""
first_program &
pids="$pids $!"
second_program &
pids="$pids $!"

এবং তারপরে অপেক্ষাটি ব্যবহার করুন (এটি যদি আপনি কেবলমাত্র শিশু প্রক্রিয়াগুলির একটি উপসেটের জন্য অপেক্ষা করতে চান তবে):

wait $pids

বিকল্প # 3

বা, যদি আপনি কেবল কোনও প্রক্রিয়া শেষ না হওয়া পর্যন্ত অপেক্ষা করতে চান , আপনি ব্যবহার করতে পারেন

wait -n $pids

বোনাস তথ্য

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

trap 'kill $(jobs -p)' SIGINT SIGTERM EXIT

1

আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ বলছি .. আমি স্ট্যাকওভারফ্লো সমাধান পেয়েছি

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

(উত্স ব্যবহারকারীলিপি; অপেক্ষা)

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

(উত্স ব্যবহারকারীলিপি; অপেক্ষা করুন) এবং অপেক্ষা করুন

@ চেপনার দ্বারা মূল উত্তরের জন্য এখানে লিঙ্কটি দেওয়া আছে: https://stackoverflow.com = 1 # 18663969


3
আমি এই সম্পর্কে পাশাপাশি চিন্তা, কিন্তু এই সমাধান ব্যর্থ হলে userscript পটভূমিতে একটি সাবস্ক্রিপ্ট যা পরে পটভূমিতে অন্য স্ক্রিপ্ট শুরু শুরু হয়। আপনার waitআদেশটি তারপরে ইউজার স্ক্রিপ্টের বাচ্চাদের জন্য অপেক্ষা করবে তবে তার নাতি নাতনিদের জন্য নয়।
টিম

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