linux - Bash স্ক্রিপ্ট প্রক্রিয়াকরণ সমান্তরাল কমান্ড সীমিত সংখ্যা



shell (3)

আমার এমন একটি ব্যাশ স্ক্রিপ্ট আছে যা দেখে মনে হচ্ছে:

#!/bin/bash
wget LINK1 >/dev/null 2>&1
wget LINK2 >/dev/null 2>&1
wget LINK3 >/dev/null 2>&1
wget LINK4 >/dev/null 2>&1
# ..
# ..
wget LINK4000 >/dev/null 2>&1

কিন্তু কমান্ডটি শেষ না হওয়া পর্যন্ত প্রতিটি লাইন প্রক্রিয়াকরণ করা হচ্ছে পরবর্তী প্রান্তে যাওয়ার জন্য খুব সময় লাগছে, আমি একবারে 20 টি লাইনের জন্য প্রক্রিয়া করতে চাই, যখন তারা শেষ হয় তখন ২0 টি লাইন প্রক্রিয়া সম্পন্ন হয়।

আমি wget LINK1 >/dev/null 2>&1 & পটভূমিতে কমান্ড পাঠাতে এবং চালিয়ে যেতে, কিন্তু এখানে 4000 লাইন রয়েছে, এর অর্থ হল আমার কার্যক্ষমতা সমস্যা থাকবে, আমার কতগুলি প্রসেসের মধ্যে সীমিত থাকার উল্লেখ নেই একই সময়ে শুরু সুতরাং এই একটি ভাল ধারণা না।

এক সমাধান যা আমি এখন চিন্তা করছি কিনা তা পরীক্ষা করছে কিনা তা এখনও চলছে কিনা তা পরীক্ষা করছে কিনা, উদাহরণস্বরূপ 20 টি লাইনের পরে আমি এই লুপ যুক্ত করতে পারি:

while [  $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done

অবশ্যই এই ক্ষেত্রে আমি লাইন শেষ করতে হবে! কিন্তু আমি মনে করি এটি করার সঠিক উপায় নয়।

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

https://ffff65535.com


অন্তর্নির্মিত wait ব্যবহার করুন:

process1 &
process2 &
process3 &
process4 &
wait
process5 &
process6 &
process7 &
process8 &
wait

উপরের উদাহরণের জন্য, 4 টি প্রসেস প্রক্রিয়া process1 ... প্রক্রিয়া 4 পটভূমিতে শুরু হবে, এবং পরবর্তী সেটটি শুরু করার আগে শেলটি শেষ হওয়া পর্যন্ত অপেক্ষা করবে।

জিএনইউ ম্যানুয়াল থেকে :

wait [jobspec or pid ...]

প্রতিটি প্রসেস আইডি পড বা কাজের স্পেসিফিকেশন দ্বারা নির্ধারিত বাচ্চা প্রক্রিয়াটি অপেক্ষা করুন, jobspec প্রস্থান করে এবং শেষ কমান্ডের প্রস্থান স্থিতিটি প্রত্যাবর্তন করুন। যদি চাকরির নমুনা দেওয়া হয় তবে চাকরির সমস্ত প্রক্রিয়াগুলির জন্য অপেক্ষা করা হয়। যদি কোনো আর্গুমেন্ট দেওয়া হয় না, তবে বর্তমানে সক্রিয় শিশু প্রক্রিয়াগুলি অপেক্ষা করা হয় এবং রিটার্ন স্ট্যাটাস শূন্য। যদি jobpec বা pid শেলের সক্রিয় সন্তানের প্রক্রিয়াটি নির্দিষ্ট না করে তবে রিটার্ন স্ট্যাটাস 127।


আপনি 20 টি প্রসেস চালাতে এবং কমান্ডটি ব্যবহার করতে পারেন:

wait

আপনার স্ক্রিপ্ট সব আপনার ব্যাকগ্রাউন্ড কাজ শেষ হলে অপেক্ষা এবং অবিরত হবে।


parallel দেখুন। তার সিনট্যাক্স xargs অনুরূপ, কিন্তু এটি সমান্তরাল কমান্ড সঞ্চালিত হয়।






shell