কীভাবে আপস্টার্টটি ব্যাক অফ করবেন, হাল ছেড়ে দেওয়ার চেয়ে


24

আমি আপস্টার্ট দুটি জিনিস করতে চাই:

  1. এত তাড়াতাড়ি একটি ব্যর্থ প্রক্রিয়া রিসন করার চেষ্টা বন্ধ করুন
  2. রেসন চেষ্টা করার সময় ছেড়ে না

একটি আদর্শ বিশ্বে আপস্টার্ট 1 সেকেন্ডের পরে একটি মৃত প্রক্রিয়া পুনরায় আরম্ভ করার চেষ্টা করবে, তারপরে প্রতিটি প্রচেষ্টাতে দ্বিগুণ হবে, যতক্ষণ না এটি এক ঘন্টা পৌঁছায়।

এই সম্ভব হয় ভালো কিছু?


never give up trying to respawnউত্তরহীন রয়ে গেছে। যে কেউ?
vemv

উত্তর:


29

আপস্টার্ট কুকবুক একটি পোস্ট-স্টপ বিলম্বের প্রস্তাব দেয় ( http://upstart.ubuntu.com/cookbook/#delay-respawn-of-a-job )। respawnযুক্তি ছাড়াই স্তবকটি ব্যবহার করুন এবং এটি চিরতরে চেষ্টা করা চালিয়ে যাবে:

respawn
post-stop exec sleep 5

(আমি এটি জিজ্ঞাসা উবুন্টু প্রশ্ন থেকে পেয়েছি )

তাত্পর্যপূর্ণ দেরি অংশটি যুক্ত করতে, আমি স্টপ-পরবর্তী স্ক্রিপ্টে পরিবেশের পরিবর্তনশীল সাথে কাজ করার চেষ্টা করব, আমার মনে হয় এরকম কিছু:

env SLEEP_TIME=1
post-stop script
    sleep $SLEEP_TIME
    NEW_SLEEP_TIME=`expr 2 \* $SLEEP_TIME`
    if [ $NEW_SLEEP_TIME -ge 60 ]; then
        NEW_SLEEP_TIME=60
    fi
    initctl set-env SLEEP_TIME=$NEW_SLEEP_TIME
end script

** সম্পাদনা করুন **

সত্যিকারের স্টপে দেরি এড়াতে, অবসন্ন হওয়ার সময়ই বিলম্বটি প্রয়োগ করতে নিম্নলিখিত ব্যবহার করুন, যা বর্তমান লক্ষ্যটি "স্টপ" কিনা তা পরীক্ষা করে:

env SLEEP_TIME=1
post-stop script
    goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
    if [ $goal != "stop" ]; then
        sleep $SLEEP_TIME
        NEW_SLEEP_TIME=`expr 2 \* $SLEEP_TIME`
        if [ $NEW_SLEEP_TIME -ge 60 ]; then
            NEW_SLEEP_TIME=60
        fi
        initctl set-env SLEEP_TIME=$NEW_SLEEP_TIME
    fi
end script

1
আপনি যদি তর্ক ছাড়াই রেসপন ব্যবহার করেন তবে পাঁচ মিনিটের উইন্ডোতে দশবার চেষ্টা করার জন্য এটি ডিফল্ট।
জেমি ককবার্ন 10

3
একটি উত্পাদন ব্যবস্থার জন্য এটির সাথে সমস্যাটি হ'ল একবার আপনি সর্বোচ্চ (s০ এর দশকে) পৌঁছে গেলে সিস্টেমটি সুস্থ হয়ে উঠলেও সর্বদা sec০ সেকেন্ড লাগবে। post-startএটি এটিকে 1 এ পুনরায় সেট করতে পারে
জোসে এফ রোমানিলো

2
@ জামিককবার্ন ডিফল্ট বিরতিটি 5 মিনিটের নয়, এটি 5 সেকেন্ডের
জিতরেক্স

1
এটি প্রায় আমার জন্য কাজ করেছে - তবে সেট-এনভির ট্রিকটি "initctl: পিআইডি 1 কাজের পরিবেশ পরিবর্তন করার অনুমতি নেই" perm পরিবর্তে আমাকে ঘুমের মানটি / টিএমপি / START_ ইউপি START_JOB এ সঞ্চয় করতে হবে এবং তারপরে এটি পুনরায় সসেসিং করতে হবে
নীল ম্যাকগিল

5

ইতিমধ্যে উল্লিখিত হিসাবে, respawnরেসনউন ট্রিগার করতে ব্যবহার করুন ।

তবে আপস্টার্ট কুকবুকের কভারেজটিrespawn-limit বলেছে যে respawn limit unlimitedনিয়মিত পুনরায় চেষ্টা করার জন্য আপনাকে নির্দিষ্ট করা দরকার ।

ডিফল্টরূপে এটি ততক্ষণ পুনরায় চেষ্টা করবে যতক্ষণ না প্রক্রিয়াটি 5 সেকেন্ডে 10 বারের বেশি শ্বাস ফেলা না করে।

আমি তাই সুপারিশ করব:

respawn
respawn limit unlimited
post-stop <script to back-off or constant delay>

4

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


3
এত জাঙ্কি আর এত মার্জিত! <3
পকোচ

3

আমি রজারের উত্তরটিতে উন্নতি করেছি। সাধারণত আপনি যখন অন্তর্নিহিত সফ্টওয়্যারটিতে অল্প সময়ের মধ্যে অনেকটা ক্র্যাশ হয়ে যাওয়ার কারণে সমস্যা দেখা দেয় তখন আপনি ব্যাকঅফ করতে চান তবে সিস্টেমটি পুনরুদ্ধার হয়ে গেলে আপনি ব্যাক অফের সময়টি পুনরায় সেট করতে চান। রজারের সংস্করণে পরিষেবাটি সর্বদা 60 সেকেন্ডের জন্য ঘুমাবে, এমনকি 7 ক্র্যাশের পরে একক এবং বিচ্ছিন্ন ক্রাশের জন্যও

#The initial delay.
env INITIAL_SLEEP_TIME=1

#The current delay.
env CURRENT_SLEEP_TIME=1

#The maximum delay
env MAX_SLEEP_TIME=60

#The unix timestamp of the last crash.
env LAST_CRASH=0

#The number of seconds without any crash 
#to consider the service healthy and reset the backoff.
env HEALTHY_TRESHOLD=180

post-stop script
  exec >> /var/log/auth0.log 2>&1
  echo "`date`: stopped $UPSTART_JOB"
  goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
  if [ $goal != "stop" ]; then
    CRASH_TIMESTAMP=$(date +%s)

    if [ $LAST_CRASH -ne 0 ]; then
      SECS_SINCE_LAST_CRASH=`expr $CRASH_TIMESTAMP - $LAST_CRASH`
      if [ $SECS_SINCE_LAST_CRASH -ge $HEALTHY_TRESHOLD ]; then
        echo "resetting backoff"
        CURRENT_SLEEP_TIME=$INITIAL_SLEEP_TIME
      fi
    fi

    echo "backoff for $CURRENT_SLEEP_TIME"
    sleep $CURRENT_SLEEP_TIME

    NEW_SLEEP_TIME=`expr 2 \* $CURRENT_SLEEP_TIME`
    if [ $NEW_SLEEP_TIME -ge $MAX_SLEEP_TIME ]; then
      NEW_SLEEP_TIME=$MAX_SLEEP_TIME
    fi

    initctl set-env CURRENT_SLEEP_TIME=$NEW_SLEEP_TIME
    initctl set-env LAST_CRASH=$CRASH_TIMESTAMP
  fi
end script

1

আপনি চান respawn limit <times> <period>- যদিও এটি আপনি সন্ধান করছেন তাত্পর্যপূর্ণ আচরণ প্রদান করবে না, এটি সম্ভবত বেশিরভাগ ব্যবহারের ক্ষেত্রে ব্যবহার করবে। আপনার জন্য খুব বড় মান ব্যবহার করে চেষ্টা করতে পারে timesএবং periodকি আপনি অর্জন করার চেষ্টা আনুমানিক হয়। দেখুন মানুষ 5 Init উপর এর অধ্যায় respawn limitরেফারেন্সের জন্য।


6
সময়কালটি সেই সময়কাল যেখানে রেসপন্স গণনা করা হয় , রেসপনগুলির মধ্যে বিলম্ব হয় না।
fedabee

1
যা আমি অনুমান করি তার অর্থ respawn limit 10 3600হ'ল আপনি যদি 10 টি প্রচেষ্টা ব্যবহার করেন তবে তা তাত্ক্ষণিকভাবে ব্যবহৃত হয়ে যাবে - যেহেতু ডিফল্টরূপে কোনও বিলম্ব হয় না।
জিতরেক্স

0

অন্যরা রেসপান এবং রেসপন সীমা স্তরের জন্য প্রশ্নের উত্তর দিয়েছেন, তবে আমি স্টপ-পরবর্তী স্ক্রিপ্টের জন্য আমার নিজস্ব সমাধান যুক্ত করতে চাই যা পুনরায় আরম্ভের মধ্যে দেরি নিয়ন্ত্রণ করে।

রজার ডিউকের প্রস্তাবিত সমাধানটির সবচেয়ে বড় সমস্যা হ'ল দেরি হ'ল ঘুম না হওয়া পর্যন্ত 'পুনরায় চালু করা জবনাম' ঝুলতে পারে।

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

respawn
respawn limit unlimited

post-stop script
    goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
    if [[ $goal != "stop" ]]; then
            if ! ps aux | grep [r]estart | grep $UPSTART_JOB; then
                    sleep 60
            fi
    fi
end script
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.