পূর্ববর্তী কমান্ডগুলি শেষ না হওয়া পর্যন্ত কোনও ব্যাশ স্ক্রিপ্ট থামিয়ে দেওয়া


20

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

##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done

আমি প্রথম 30 এর পরে লুপের জন্য অন্য 30 টিতে চালিয়ে যেতে চাই example উদাহরণস্বরূপ

##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &

for i in {31..60}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done

নতুন সেট শুরু করার আগে প্রথম সেটটি শেষ করার জন্য আমি চাই। তবে কারণগুলি দেখে nohupমনে হয় যে তারা সবাই একযোগে চালিত।

আমার কাছে nohupকারণ আমি দূরবর্তীভাবে আমার সার্ভারে লগইন করেছি এবং সেখানে কাজ শুরু করব এবং তারপরে আমার বাশ বন্ধ করব। বিকল্প সমাধান আছে কি?


1
waitঅন্তর্নির্মিত জন্য ম্যানুয়াল অনুসন্ধান করুন ।
স্যাটাস কাতসুরা

উত্তর:


22

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

#!/bin/bash
# run two processes in the background and wait for them to finish

nohup sleep 3 &
nohup sleep 10 &

echo "This will wait until both are done"
date
wait
date
echo "Done"

6

কয়েকটি বিষয়:

  • যদি আপনার লক্ষ্যটি nohupহ'ল কোনও রিমোট শেল থেকে আপনার কর্মী প্রক্রিয়াগুলিকে হত্যা করা থেকে বিরত করা nohupহয় তবে আপনাকে স্ক্রিপ্টে ব্যবহার করা উচিত , এটি তৈরির পৃথক কর্মী প্রক্রিয়াগুলিতে নয়।

  • এখানেnohup বর্ণিত হিসাবে , কেবলমাত্র প্রক্রিয়াগুলি SIGHUP গ্রহণ করা এবং টার্মিনালের সাথে আলাপচারিতা থেকে বিরত রাখে তবে শেল এবং এটির শিশু প্রক্রিয়াগুলির মধ্যে সম্পর্ককে ভেঙে দেয় না।

  • উপরের পয়েন্টটির কারণে, সাথে বা বাইরে nohup, waitদুটি forলুপের মধ্যে একটি সাদামাটা forপ্রথম দ্বারা চালিত সমস্ত শিশু প্রক্রিয়াটি বের হয়ে যাওয়ার পরে কেবল দ্বিতীয়টি কার্যকর করা হবে for

  • একটি সরল সহ wait:

    সমস্ত সক্রিয় শিশু প্রক্রিয়াগুলির জন্য অপেক্ষা করা হচ্ছে, এবং ফেরতের অবস্থা শূন্য।

  • আপনার যদি forপ্রথমটিতে কোনও ত্রুটি না ঘটে কেবল দ্বিতীয়টি চালানোর প্রয়োজন হয় , তবে আপনাকে প্রতিটি কর্মী পিআইডি দিয়ে সংরক্ষণ করতে হবে $!এবং তাদের সকলকে এখানে প্রেরণ করতে হবে wait:

    pids=
    for ...
        worker ... &
        pids+=" $!"
    done
    wait $pids || { echo "there were errors" >&2; exit 1; }

সার্ভারে চলছে এমন অন্যান্য কাজও। সুতরাং আমি কেবলমাত্র আমার ব্যাচের জন্য অপেক্ষা করতে চাই .. সেগুলি আর স্ক্রিপ্টস তাই এটি কমান্ডের অধীনে Rবা চালানো হয়cc1plustop
masfenix

"সমান্তরাল" সমস্ত কমান্ড চালানোর জন্য আমি ভিতরে নোহপ ব্যবহার করতে চাই। মূলত এগুলি একটি বৈজ্ঞানিক প্রোগ্রামের সিমুলেশন। আমি মোট 180 টি সিমুলেশন চালাতে চাই, তবে 60 এর ব্যাচগুলিতে The কাউন্টারেরও 1 থেকে 180 পর্যন্ত যেতে হবে i আমি যদি একবারে সেগুলি করি তবে এটি খুব বেশি সময় নিতে পারে।
মাস্ফেনিক্স

waitbashব্যাকগ্রাউন্ড কাজের জন্য অপেক্ষা করার কারণ এটি নিজেই তৈরি হয়েছিল, অন্য কিছু নয়। এখানে কিছু বিভ্রান্তি থাকতে পারে- এই forলুপগুলি, আপনি কি এগুলি কোনও ফাইলে সংরক্ষণ করেছেন এবং স্ক্রিপ্ট হিসাবে তাদের অনুরোধ করেছেন ( ##scriptলাইনের কারণে যা আমি ধরে নিয়েছি ), বা আপনি টার্মিনালে হাত দিয়ে টাইপ করছেন?
মেটেই ডেভিড

-1

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

help fgবিশদ জন্য চেষ্টা করুন।


একটি স্ক্রিপ্ট চাকরি নিয়ন্ত্রণ ছাড়াই চলে।
Kusalananda

-1

আপনি যদি আপনার দুটি forলুপের মধ্যে নিম্নলিখিত কোড বিভাগের মতো কিছু সন্নিবেশ করেন তবে এটি সহায়তা করতে পারে।

flag=0

while [ flag -eq 0 ]
do
  ps -ef | grep "Rscript --vanilla" | grep -v grep > /dev/null
  flag=${?}
  sleep 10
done

অবশ্যই, যদি আপনার অ্যাপ্লিকেশনটিতে Rscriptসফলভাবে শেষ না করার এবং চারপাশে দীর্ঘকালীন হওয়ার সুযোগ থাকে, তবে আপনার দ্বিতীয়টি লুপের জন্য চালানোর সুযোগ নাও পেতে পারে। উপরের কোড বিভাগটি ধরে নেওয়া হয়েছে, সনাক্তকারী সহ সমস্ত প্রক্রিয়া Rscript --vanillaসঠিকভাবে সম্পূর্ণ হবে এবং অদৃশ্য হয়ে যাবে। আপনার অ্যাপ্লিকেশনটি কী করে এবং এটি কীভাবে চালিত হয় তা জেনেও আমাকে এই অনুমানের উপর নির্ভর করতে হবে।

সম্পাদনা

মন্তব্যের আলোকে এটি আপনার প্রয়োজনের সাথে আরও ভাল মানায়। (এটিতে আপনার আসল কোডের পাশাপাশি সমাপ্তি পরীক্ষার যুক্তি অন্তর্ভুক্ত)

for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
pids[$i]=${!}
done

flag=0

while [ flag -eq 0 ] 
do
  for PID in $(echo ${pids[@]})
  do
    flag=1
    ps -ef | grep ${PID} | grep -v grep >/dev/null; r=${?}
    if [ ${r} -eq 0 ]
    then 
      flag=0
    fi
  done
done

for i in {31..60}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done

প্রক্রিয়া নাম topশো হয় Rকখনও কখনও বা হয় cc1plus
মাস্ফেনিক্স

সেক্ষেত্রে আপনাকে ps -efতালিকাতে প্রদর্শিত একটি সাধারণ ডিনোমিনেটর খুঁজে বের করতে হবে । অথবা প্রতিটি nohupকমান্ডের পরে , পিআইডি একটি ভেরিয়েবলের কাছে রেকর্ড করুন (পছন্দসই একটি অ্যারে) echo ${!}এবং পিআইডিগুলির এই গোষ্ঠীর জন্য চেক করুন। যখন তারা সব অন্তর্হিত হওয়া, আপনি দ্বিতীয় এগিয়ে যেতে পারেন forলুপ
MelBurslan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.