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


9

আমার স্ক্রিপ্টে আমি ইনপুট_এএ, ইনপুট_এব, ইত্যাদিতে সেট করা একটি ডেটা বিভক্ত করি তারপরে, আমি প্রতিটি একই পাইথন স্ক্রিপ্টের মাধ্যমে চালিত করি, যেমন:

# Execute program on each split file
for part in input_*; do
        python3 $part &
done
wait

আমার প্রশ্ন দ্বিগুণ: আমি কীভাবে সনাক্ত করব যে একটি পাইথন প্রক্রিয়া ব্যর্থ হয়েছে, এবং যখন সনাক্ত করা যায়, তখন আমি কীভাবে সমস্ত প্রসন্ন বাচ্চাদের হত্যা করব এবং একটি ব্যর্থতার সাথে স্ক্রিপ্ট থেকে প্রস্থান করব?

উত্তর:


10

আপনি একটি প্রক্রিয়া গ্রুপ ব্যবহার করতে পারেন:

set -m
(
   for part in input_*; do
     (python3 "$part" || kill 0) &
   done
   wait
)

set -m(এবং Pচ্ছিক POSIX শেল বৈশিষ্ট্য, প্রয়োজনীয় ইউনিক্স শেল বৈশিষ্ট্য) তাদের নিজস্ব প্রক্রিয়া গোষ্ঠীতে কাজ চালায়। ইন bash, yash, zsh, mksh, subshell যেখানে কাজ যে set -mসক্রিয় করা হয়, যাতে বাইরের (...)সব মধ্যে নির্মিত প্রক্রিয়া একই প্রক্রিয়া দলের স্থাপন করা হবে।

জন্য dashএবং অন্যান্য ashভিত্তিক শেল, যে শুধুমাত্র শীর্ষ স্তরের শেল প্রক্রিয়া এ কাজ করে। সুতরাং কোডটি সাব-শেল না করা পর্যন্ত কাজ করবে।

এটি এটিএন্ডটি kshবা পুরানো এসএসভি / বোর্ন শেলটি মোটেই কাজ করবে না ।

kill 0 বর্তমান প্রক্রিয়া গোষ্ঠীর সমস্ত সদস্যকে একটি সংকেত সিগন্যাল প্রেরণ করে।


ব্যাশে আমি কেন একটি শেবাং অন্তর্ভুক্ত করেছি - প্রয়োজনীয় শেল পরিষ্কার নয়। উত্তম উত্তর
জিম এমকনামারা

@jimmcnamara, যে কাজ bash, dash, yash, mksh, zsh। মূলত কোনও পসিক্স শেল তবে এটি ও টি কেএসএস। set -m(আন্ডার-) পসিক্সে নির্দিষ্ট করা হয়েছে তবে anচ্ছিক বৈশিষ্ট্য হিসাবে।
স্টাফেন চেজেলাস

আমি সোলারিস ব্যবহার করি। / বিন / শ উড়ে যাবে না।
জিম এমকনামার

@ জিম্মকনামারা, সোলারিস 10 এ / বিন / এস এবং তার আগে বোর্ন শেল (পসিক্স শেল নয়) এবং 11 এ, এটিএন্ডটি কেএসএস রয়েছে। আমি যেমন বলেছি, এটি ব্যাশ, ড্যাশ, যশ, ম্যাক্স, জেডএসে কাজ করে।
স্টাফেন চেজেলাস

1
@ মেকজার্ভস, এটি প্রক্রিয়াটি 1 এ প্রতিস্থাপন করবে, কিন্তু প্রক্রিয়া গোষ্ঠীর বাইরে এনে দেবে না। kill 0প্রক্রিয়া গ্রুপের সমস্ত সদস্যকে তাদের পিতামাতা যাই হোক না কেন হত্যা করে। ps -jপ্রক্রিয়া গ্রুপ আইডি দেখতে দেখুন ।
স্টাফেন চেজেলাস

3

এটি একটি উদাহরণ। আপনার যা প্রয়োজন ঠিক তা পেতে প্রথমে এটি খেলুন। এটি যেমন হয় তেমন ভাঙতে পারে না।

#!/bin/bash
# Example of killing off all children

> killfile
> outfile.err
kill_em()
{
   echo 'killing all children ' > 2
   while read pid
   do
      kill -0 $pid && kill -9 $pid  # if still running kill it
   done < killfile
   exit 1
}

export grandparentpid=$$
trap 'kill_em' 6
for i in 2 2 3 4 5 6 7 8 9 10
do
        ( sleep $i && ls oinkle  >> outfile 2>> outfile.err &
          pid=$!
          echo $pid >> killfile
          wait $!
          [ $? -ne 0 ] && kill -6 $grandparentpid
        ) &
done
wait

ইচ্ছাকৃতভাবে ব্যর্থ হওয়ার জন্য এটি সেটআপ কারণ ls oinkleব্যর্থ হবে (আমার মেশিনে)।

যখন আপনি স্টার্টার স্ক্রিপ্টের সাথে ঝাঁকুনির পরে যা প্রয়োজন তা পেয়ে যাবেন --- পরিবর্তন করুন:

for i in 2 2 3 4 5 6 7 8 9 10

প্রতি:

for part in input_* 

পরিবর্তন:

sleep $i && ls oinkle 

প্রতি:

python3 $part 

পুনর্নির্দেশগুলি লগগুলি সংরক্ষণ করার জন্য রয়েছে। আপনি তাদের নাও চাইতে পারেন।


এটা কিছুটা নিষ্ঠুরতা। অন্য কোনও কাজ শুরুর আগে যদি কোনও একটি চাকরী ব্যর্থ হয়, তবে আপনার শুরু করা কাজের killfileসমস্ত পিডগুলি নাও থাকতে পারে।
স্টাফেন চেজেলাস

কয়েকটি খারাপ অভ্যাস যেমন: অব্যক্ত ভেরিয়েবল, নামের পরিবর্তে সিগন্যাল নম্বর ব্যবহার, সিগন্যাল 6 ব্যবহার করুন (উদাহরণস্বরূপ লিনাক্স এএমডি 64 তে ABRT) পরিবর্তে ইউএসআর 1 / ইউএসআর 2 ব্যবহারকারীর সংকেত, [ $? -ne 0 ]...
স্টাফেন চ্যাজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.