শেল স্ক্রিপ্ট ব্যাকগ্রাউন্ড কমান্ডের জন্য অপেক্ষা করে


12

আমি একটি স্ক্রিপ্ট লিখছি, তবে আমার এমন কিছু প্রয়োজন আছে যা আমি এটি করার উপায় খুঁজে পাচ্ছি না ...

আমাকে "কমান্ড 1 &" ব্যাকগ্রাউন্ডে একটি কমান্ড তৈরি করতে হবে এবং তারপরে স্ক্রিপ্টের কোথাও আমার কমান্ড 2 করার আগে এটি শেষ হওয়ার অপেক্ষা করতে হবে। মূলত, আমার এটি দরকার:

দ্রষ্টব্য: প্রতিটি কমান্ড একটি নির্দিষ্ট ডিরেক্টরিতে চলে! লুপের শেষে আমার কমান্ড 1 4 টি ডিরেক্টরি তৈরি করেছে, যেখানে প্রতিটি এক নির্দিষ্ট প্রক্রিয়া চালায় তাই মোট প্রক্রিয়া চলমান 4

a=1

while [$a -lt 4 ]

     . command1
   #Generates 1 Process  

     a= `export $a +1`
done

   #Wait until the 4 process end and then run the command2 

    . command2

আমি waitপিড প্রক্রিয়া নম্বর সহ একটি কমান্ড সম্পর্কে কিছু দেখেছি , কিন্তু এটি কার্যকর হয়নি।


আপনি নিয়ন্ত্রণ করেন command1? আপনি কি এটি পরিবর্তন করতে পারেন যাতে এটি 4 টি প্রক্রিয়ার পিআইডি ফিরিয়ে দেয়?
টেরডন

হ্যাঁ! আমার কাছে এটি ইতিমধ্যে আছে :)
জোয়াও ম্যাকাও

আমি আমার উত্তর অনুসারে আপডেট করেছি। এটি যদি আপনার ক্ষমতার সাথে মেলে তবে আমাকে বলুন।
লরেন্ট সি

এই কিউটি এইটির সাথে সম্পর্কিত: unix.stackexchange.com/questions/100801/… । পার্থক্য কেবলমাত্র আপনার পটভূমি প্রক্রিয়া থেকে পিআইডি পেতে হবে। $!এটি পেতে আপনি ভেরিয়েবলটি ব্যবহার করতে পারেন , এটি waitআমি এখানে প্রদর্শিত কমান্ডটিতে দিয়েছি। $!সর্বশেষ ব্যাকগ্রাউন্ড পিআইডি $$রয়েছে , যেখানে সর্বশেষ প্রক্রিয়া চালানোর পিআইডি রয়েছে।
slm

3
ঠিক আছে, এখন আপনার স্ক্রিপ্টটি মোটেই বোঝা যায় না। চারপাশে সিনট্যাক্স ত্রুটি এবং অদ্ভুততা রয়েছে। আপনি কি আমাদের প্রকৃত স্ক্রিপ্টটি দেখাতে পারেন ? আপনি কেন কমান্ড সোর্সিং? শুধু তাদের ফাঁসি দেওয়া হবে না কেন?
টেরডন

উত্তর:


22

wait PIDপ্রক্রিয়াটি শেষ হওয়ার জন্য অপেক্ষা করতে আপনি কমান্ডটি ব্যবহার করতে পারেন ।

আপনি সর্বশেষ কমান্ডের পিআইডি পুনরুদ্ধার করতে পারেন $!

আপনার ক্ষেত্রে, এর মতো কিছু কাজ করবে:

command1 & #run command1 in background
PID=$! #catch the last PID, here from command1
command2 #run command2 while command1 is running in background
wait $PID #wait for command1, in background, to end
command3 #execute once command1 ended

আপনার সম্পাদনা অনুসরণ করে, যেমন আপনার একাধিক পিআইডি রয়েছে এবং আপনি সেগুলি জানেন, আপনি এটি করতে পারেন:

command1 & #run command1 in background
PID1=xxxxx
PID2=yyyyy
PID3=xxyyy
PID4=yyxxx
command2 #run command2 while command1 is running in background
wait $PID1 $PID2 $PID3 $PID4 #wait for the four processes of command1, in background, to end
command3 #execute once command1 ended

আপনার সম্পাদনা অনুসরণ করে, আপনি যদি পিআইডি তৈরি (এক্সএক্সএক্সএক্সএক্সএক্সএক্স, এক্সিআই, এক্সসিআইআই, ইয়াইএক্সএক্সএক্সএক্স) জানেন তবে আপনি অপেক্ষা করতে পারেন পিআইডি-র তালিকা সহ (মানুষ দেখুন)। আপনি যদি এগুলি জানেন না, তবে আপনি তাদের কমান্ড 1 এ জড়ো করতে পারেন (কমান্ড 1 কী? আপনার নিজের একটি স্ক্রিপ্ট?)
লরেন্ট সি।

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

4

এটি করার সর্বোত্তম উপায় comamnd1হ'ল আপনার ফিরতি চালু হওয়া প্রক্রিয়াগুলির পিআইডি হ'ল এবং waitপ্রতিটিতে @ লরেন্টসির উত্তরের পরামর্শ অনুসারে এটি ব্যবহার করুন ।

অন্য পদ্ধতির কিছু হবে:

## Create a log file
logfile=$(mktemp)

## Run your command and have it print into the log file
## when it's finsihed.
command1 && echo 1 > $logfile &

## Wait for it. The [ ! -s $logfile ] is true while the file is 
## empty. The -s means "check that the file is NOT empty" so ! -s
## means the opposite, check that the file IS empty. So, since
## the command above will print into the file as soon as it's finished
## this loop will run as long as  the previous command si runnning.
while [ ! -s $logfile ]; do sleep 1; done

## continue
command2

দুঃখিত তবে এখনও কাজ করছে না .. আমি আবার আমার প্রশ্নে উন্নতি করব!
জোয়াও ম্যাকাও

0

আপনি যদি নীচের পদ্ধতিটি ব্যবহার করেন তবে কিছুক্ষণ লুপের পরে আপনার বিশেষ "সমস্ত প্রক্রিয়ার জন্য অপেক্ষা করুন" দরকার নেই। লুপটি command1চক্রের শীর্ষে ফিরে আসার আগে কারেন্টটি শেষ হওয়ার অপেক্ষা করবে । কোন পরামর্শ হিসাবে যত্ন ব্যবহার করুন। লক্ষ্য করুন, আমি যা করেছি তা কেবল & wait $!আপনার শেষের সাথে যুক্ত হয়েছিল command1

a=1
while [$a -lt 4 ]
     . command1  & wait $!
   #Generates 1 Process  
     a= `export $a +1`
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.