দূরবর্তী মেশিনে সমান্তরালে স্ক্রিপ্টগুলি কীভাবে চালানো যায়?


16

আমি একটি রিমোট মেশিনে এসএসএস করতে পারি যার 64৪ টি কোর রয়েছে। বলি আমাকে এই মেশিনে সমান্তরালভাবে 640 শেল স্ক্রিপ্টগুলি চালানো দরকার। আমি এটা কিভাবে করবো?

আমি 640 স্ক্রিপ্টগুলি 10 টি স্ক্রিপ্টের প্রতিটি 64 টি গ্রুপে বিভক্ত দেখতে পাচ্ছি। এরপরে আমি কীভাবে এই প্রতিটি গ্রুপকে সমান্তরালভাবে চালাতে পারি , অর্থাৎ উপলব্ধ কোরগুলির প্রত্যেকটির উপর একটি গ্রুপ।

ফর্ম একটি স্ক্রিপ্ট চাই

    ./script_A &
    ./script_B &
    ./script_C &
    ...

যেখানে script_Aপ্রথম গ্রুপের সাথে মিলিত হয়, script_Bদ্বিতীয় গ্রুপের সাথে ইত্যাদি, যথেষ্ট?

একটি গোষ্ঠীতে থাকা একটি গ্রুপের স্ক্রিপ্টগুলি ক্রমানুসারে চালানো ঠিক আছে, তবে আমি চাই গ্রুপগুলি সমস্ত কোরগুলিতে সমান্তরালে চলুক।


এটি গ্যারান্টিযুক্ত নয় যে তারা কোর দ্বারা সমানভাবে বিতরণ করা হয়েছে। এই থ্রেড একবার দেখুন। stackoverflow.com/questions/13583146/…
রুই এফ রিবেইরো

উত্তর:


24

এটি gnu সমান্তরাল জন্য একটি কাজের মত দেখাচ্ছে:

parallel bash -c ::: script_*

সুবিধাটি হ'ল আপনাকে আপনার স্ক্রিপ্টগুলি কোর দ্বারা গোষ্ঠী করতে parallelহবে না, এটি আপনার জন্য করবে।

অবশ্যই, স্ক্রিপ্টগুলি চলাকালীন আপনি যদি এসএসএইচ সেশনটি বেবিসিত করতে না চান তবে আপনার ব্যবহার করা উচিত nohupবাscreen


এটি একটি ভাল উত্তর এবং আমি এটি সাধারণভাবে গ্রহণ করি যেমন এটি ভালভাবে কাজ করবে U দুর্ভাগ্যক্রমে আমার পক্ষে ব্যক্তিগতভাবে আমার কাছে দূরবর্তী মেশিনে প্রশাসকের অধিকার নেই এবং তাই parallelপ্যাকেজটি ইনস্টল করতে পারছি না । ধন্যবাদ
টম

10
আপনাকে বিশ্বব্যাপী সমান্তরাল ইনস্টল করতে হবে না: আপনার নিজের হোম ডিরেক্টরি থেকে একটি অনুলিপি চালানো উচিত।
ধাগ

bash -cঅপ্রয়োজনীয় হতে পারে: parallel ::: ./script*। 40৪০ স্ক্রিপ্টের সাথে সম্ভবত এটি খুব মিল (যেমন, কেবল একটি যুক্তি আলাদা)। তার জন্য এই আর্গুমেন্টগুলি সেট করতে সরাসরি সিএনএন সমান্তরাল ব্যবহার এবং একক স্ক্রিপ্ট ব্যবহার বিবেচনা করুন।
ওলে টাঞ্জ

আমি কীভাবে একটি দূরবর্তী মেশিনে gnu সমান্তরাল ইনস্টল করব?
টম

@ টম আপনি একটি রিমোট মেশিন ব্যবহার করছেন তা দ্বারা কী পরিবর্তন হয়েছে? Gnu.org/software/parallel থেকে সঠিক প্যাকেজটি পান এবং ইনস্টল করুন।
দিমিত্রি গ্রিগরিয়েভ

5

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

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;

যে আউটপুটগুলির সাথে আমি উদ্বিগ্ন তা নিরীক্ষণ করছি - আমি ssh অধিবেশনটি খোলা রাখতে চাই না। নোহুপ ব্যবহার সম্পর্কে কী? এই স্ক্রিপ্টগুলি থামাতে বাধা দেবে যদি সেশনটি শেষ হয়? আপনার 'স্ক্রিন সুপারিশটিও আমি একবার দেখে নেব। ধন্যবাদ! '
টম

nohupসম্ভবত কাজ করবে, আমি আরও বেশি পরিচিত screenএবং এর সাথে আরও অনেকগুলি কার্যকারিতা রয়েছে যা আপনার পক্ষে কার্যকর হতে পারে বা নাও পারে।
ডেভিড কিং

2

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

গ্রিড ইঞ্জিন তার জন্য তৈরি করা হয়েছে, উদাহরণস্বরূপ, সান গ্রিড ইঞ্জিন ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) বা ওপেন গ্রিড সময়সূচী ( http://gridscheduler.sourceforge.net/ )। আপনার শুরু করার আগে আপনার জন্য যথাযথ সফ্টওয়্যার ইনস্টল করার জন্য প্রশাসকের দরকার নেই। অ্যাডমিনিস্ট্রেটর মেশিনে কয়েক শত প্রক্রিয়া চালিত হওয়ার পরিবর্তে এটি করতে পেরে খুশি হতে পারেন এবং সেগুলির কোনও নিয়ন্ত্রণ নেই।

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



0

আমি বেশ কয়েকটি অনুষ্ঠানে এটি করেছি এবং সাধারণত কাজের নিয়ন্ত্রণ দিয়ে কাজটি করার জন্য কেবল আমার নিজের স্ক্রিপ্টটি রোল করি। সাধারণ কোনও স্ক্রিপ্টের নাম যদি আপনি কোনও ফাইলটিতে চালাতে চান তবে সমাধানটি এর মতো দেখায়:

#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
  NUM=$((NUM+1))
  ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
  if [ $NUM -ge $MAX_PROCS ];then
    echo "Waiting for $NUM processes to finish."
    wait
    NUM=0
  fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit

এটি নিষ্ঠুর শক্তি, কিন্তু কার্যকর। এছাড়াও আপনার সিস্টেমে সমান্তরাল যুক্ত কোনও অতিরিক্ত সফ্টওয়্যার দরকার নেই।

একটি বড় সমস্যা হ'ল ওয়েট কমান্ডটি ধীর স্ক্রিপ্টটি শেষ হওয়ার জন্য অপেক্ষা করবে, যা সময় নষ্ট করতে পারে। আমি এই পরিস্থিতিটি যত্ন নেওয়ার জন্য স্ক্রিপ্ট তৈরি করেছি, তবে আপনি কল্পনা করতে পারেন সেগুলি আরও জটিল হয়ে যায়। আপনার সমস্ত স্ক্রিপ্ট যদি প্রায় একই পরিমাণে চলতে থাকে তবে এটি ভালভাবে কাজ করে।

আরেকটি সমস্যা হ'ল সেরা পারফরম্যান্স নির্ধারণ করতে আপনাকে MAX_PROCS টিউন করতে হতে পারে।

অবশ্যই, এসএসএস সংযোগের সংখ্যা অকাট্য হতে পারে। এই ক্ষেত্রে এই স্ক্রিপ্টটি কেবল দূরবর্তী হোস্টে স্থানান্তর করুন এবং সরাসরি স্ক্রিপ্টগুলি চালানোর জন্য "ssh ..." লাইনটি পরিবর্তন করুন।

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