সমান্তরালে চলমান subshells থেকে প্রস্থান কোড পান


4

আমি দীর্ঘ রানার প্রসেসের একটি Serie আরম্ভ করার জন্য একটি শেল স্ক্রিপ্ট তৈরি করার চেষ্টা করুন। চলুন তাদের একটি, বি, সি, ডি এবং ই কল। প্রক্রিয়াগুলি b, c এবং d সমান্তরালভাবে চলতে হবে এবং পূর্ববর্তীগুলির সমস্ত শেষ হওয়ার পরে প্রক্রিয়াটি চালানো উচিত সফলভাবে

আমার (ছদ্ম-) কোড আছে:

{
    echo "starting a"
    a
}&&
{
    (echo "starting b"; b; exit $?)&
    (echo "starting c"; c; exit $?)&
    (echo "starting d"; d; exit $?)&
    wait
}&&
{
    echo "starting e"
    e
}

আমার সমস্যা হল, যদি b, c, d এর মধ্যে কোনটি ব্যর্থ হয়, স্ক্রিপ্টটি চলতে থাকে এবং e চালিত হয়। যে প্রতিরোধ করার একটি উপায় আছে?

কোন উত্তর জন্য বিশাল ধন্যবাদ!

Antoine:


(echo "starting b"; b; exit $?) - দ্য exit $? স্পষ্টভাবে অকার্যকর। আপনি এটি বন্ধ করতে পারেন এবং উপশহর বি যাইহোক থেকে প্রস্থান কোড ফিরে আসবে।
Theodros Zelleke

সম্ভাব্য সদৃশ stackoverflow.com/questions/356100/...
jpe

উত্তর:


2
{
    (echo "starting b"; b)&
    (echo "starting c"; c)&
    (echo "starting d"; d)&
    wait %1 && wait %2 && wait %3
}&&

একটি নির্দিষ্ট কাজের জন্য অপেক্ষা করার সময় wait এই কাজ প্রস্থান কোড ফেরত

এই দুটি উদাহরণ তাকান বুঝতে:
শুধুমাত্র শেষ লাইন গুরুত্বপূর্ণ (প্রস্থান অবস্থা দেখায় wait )

(sleep 3; false) & wait; echo $?
[1] 25358
[1]+  Exit 1                  ( sleep 3; false )
0

-

(sleep 3; false) & wait %1; echo $?
[1] 25362
[1]+  Exit 1                  ( sleep 3; false )
1

এটি সমস্ত প্রক্রিয়া সম্পন্ন করার জন্য অপেক্ষা করবে, তবে আইআর প্রস্থান স্থিতিটি ক্যাপচার করবে না।
Henk Langeveld

1
@ হেনকলেজভেল্ডড: আপনার আপত্তির প্রতিক্রিয়ায় আমি আমার উত্তর আপডেট করেছি
Theodros Zelleke

0

পটভূমিতে একটি প্রক্রিয়া চলাকালীন, আপনি মূলত শেলটিকে বলেছিলেন যে আপনি তার সাফল্য বা ব্যর্থতার বিষয়ে আগ্রহী নন।

wait ইচ্ছাশক্তি এটি প্রযোজ্য হলে, এটির প্রস্থান কোডের যে কোনও সংকেতের মূল্য রিপোর্ট করুন। এই আপনি খুঁজছেন হয় না।

একটি কমান্ড stdout তার অবস্থা রিপোর্ট করতে হবে এবং grep সঙ্গে প্রতিক্রিয়া গণনা।

{
  (echo "starting b"; b && echo ok)&
  (echo "starting c"; c && echo ok)&
  (echo "starting d"; d && echo ok)&
} | 
grep -c ok | ( read n && (( n==3 )) ) && 

{
echo "starting e"; e
}

মধ্যে ksh93, grep -c ok | read n && (( n==3 )) && পাশাপাশি কাজ করবে।
Henk Langeveld
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.