প্রক্রিয়াটির ভুল পিআইডি আপস্টার্ট ট্র্যাকিং - রিসাপ্যানিং নয়


11

আমি মূলত স্ট্যাক ওভারফ্লোতে এই প্রশ্নটি জিজ্ঞাসা করেছি। তখন বুঝতে পারলাম যে এটি সম্ভবত আরও ভাল জায়গা।

আমার বিলম্বিত_জব প্রক্রিয়াগুলি নিরীক্ষণের জন্য আমার ব্লুপিল সেটআপ রয়েছে। (রুবি অন রেলস আবেদন)

উবুন্টু 12.10 ব্যবহার করে।

আমি উবুন্টু ব্যবহার করে নিজেই ব্লুপিল পরিষেবাটি শুরু এবং নিরীক্ষণ করছি upstart। আমার আপস্টার্ট কনফিগারেশনটি নীচে ( /etc/init/bluepill.conf)।

description "Start up the bluepill service"

start on runlevel [2]
stop on runlevel [016]

expect daemon
exec sudo /home/deploy/.rvm/wrappers/<app_name>/bluepill load /home/deploy/websites/<app_name>/current/config/server/staging/delayed_job.bluepill

# Restart the process if it dies with a signal
# or exit code not given by the 'normal exit' stanza.
respawn

আমি এর expect forkপরিবর্তে চেষ্টাও করেছি expect daemon। আমি expect...লাইনটি পুরোপুরি সরিয়ে দেওয়ার চেষ্টা করেছি ।

মেশিন বুট হয়ে গেলে, ব্লুপিল সূক্ষ্ম শুরু হয়।

$ ps aux | grep blue
root      1154  0.6  0.8 206416 17372 ?        Sl   21:19   0:00 bluepilld: <app_name>

ব্লুপিল প্রক্রিয়াটির পিআইডি এখানে 1154। তবে upstartমনে হয় ভুল পিআইডি ট্র্যাক করছে। এটি একটি পিআইডি ট্র্যাক করছে যা বিদ্যমান নেই।

$ initctl status bluepill
bluepill start/running, process 990

আমি মনে করি এটি sudoব্লুপিল প্রক্রিয়া শুরু হওয়া প্রক্রিয়ার পিআইডি ট্র্যাক করছে ।

যদি আমি জোর করে ব্লুপিল ব্যবহার করে মেরে ফেলি তবে এটি ব্লুপিল প্রক্রিয়াটিকে পুনরুদ্ধার করতে বাধা দিচ্ছে kill -9

তদুপরি, আমি মনে করি ভুল পিআইডি ট্র্যাক হওয়ার কারণে, রিবুট / শাটডাউনটি কেবল স্তব্ধ হয়ে যায় এবং প্রতিবারই আমাকে মেশিনটিকে হার্ড রিসেট করতে হয়।

এখানে সমস্যা কি হতে পারে?

আপডেট :

সমস্যাটি আজ অবধি (3 মে 2015) উবুন্টু 14.04.2 তে রয়ে গেছে।

সমস্যাটি সুডো ব্যবহারের কারণে নয়। আমি আর সুডো ব্যবহার করছি না। আমার আপডেট হওয়া আপস্টার্ট কনফিগারেশনটি হ'ল:

description "Start up the bluepill service"

start on runlevel [2]
stop on runlevel [016]

# Restart the process if it dies with a signal
# or exit code not given by the 'normal exit' stanza.
respawn

# Give up if restart occurs 10 times in 90 seconds.
respawn limit 10 90

expect daemon

script
    shared_path=/home/deploy/websites/some_app/shared

    bluepill load $shared_path/config/delayed_job.bluepill
end script

যখন মেশিন বুট হয়, প্রোগ্রামটি সূক্ষ্ম লোড হয়। তবে উপরে বর্ণিত হিসাবে আপস্টার্ট এখনও ভুল পিআইডি ট্র্যাক করে।

মন্তব্যে উল্লিখিত কর্মপরিকল্পনা হ্যাঙ্গিংয়ের সমস্যার সমাধান করতে পারে। যদিও আমি চেষ্টা করে দেখিনি।


আপনি কি 990 প্রক্রিয়াটি দেখার চেষ্টা করেছেন? ps aux | grep 990এটি করা উচিত তবে pstree 990আরও তথ্যপূর্ণ হতে পারে।
অলি

990 এর পিআইডি সহ কোনও প্রক্রিয়া বিদ্যমান নেই।
অঞ্জন


এবং আপনি এই আদেশটি দিয়ে সেই সরঞ্জামটি গতিময় করতে পারেন: cho প্রতি 3000 | sudo tee / proc / sys / kernel / pid_max
andersonbd1

উত্তর:


8

বেশ দেরিতে, তবে আশা করি এটি অন্যান্য ব্যবহারকারীদের পক্ষে সহায়ক হতে পারে।

আপস্টার্টে একটি ডকুমেন্টেড বাগ রয়েছে যা আপনি একটি আপস্টার্ট কনফিগারেশনে ভুল স্তন নির্দিষ্ট করে দিলে ভুল পিআইডি ট্র্যাক করার জন্য আর্ট্রিক্টের কারণ হতে পারে fork: https://bugs.launchpad.net/upstart/+bug/406397

যা ঘটে তা হ'ল আপস্টার্টটি forkস্তম্ভটি পরীক্ষা করে এবং প্রোগ্রামটির "সত্য" পিআইডি নির্বাচন করার আগে এটি কতটা কাঁটাচামচ প্রক্রিয়া পরীক্ষা করা উচিত তা নির্ধারণ করে। যদি আপনি উল্লেখ করেন expect forkবা expect daemonতবে আপনার প্রোগ্রামটি পর্যাপ্ত পরিমাণে কাঁটাচামচ না করে তবে startস্তব্ধ হয়ে যাবে। অন্যদিকে, যদি আপনার প্রক্রিয়াটি অনেক বার কাঁটাচামচ করে initctlতবে ভুল পিআইডি ট্র্যাক করবে। তাত্ত্বিকভাবে, এটি আপস্টার্ট কুকবুকের এই বিভাগে নথিভুক্ত করা উচিত , তবে আপনি এই পরিস্থিতিতে দেখতে পাচ্ছেন যে নিখরচায় হওয়া প্রক্রিয়াটির সাথে একটি পিআইডি যুক্ত থাকে যখন এমনটি হওয়া উচিত ছিল না।

এর প্রভাবগুলি বাগ-ট্র্যাকারের মন্তব্যে ব্যাখ্যা করা হয়েছে, তবে আমি এখানে সংক্ষিপ্ত করে বলব: initctlডিমন প্রক্রিয়াটি থামাতে না পেরে এবং একটি অনিবন্ধিত / অবৈধ অবস্থায় আটকা পড়ার পাশাপাশি <service> start/killed, process <pid>, যদি সেই পিআইডি-র প্রক্রিয়াটি বন্ধ হয়ে যায় (এবং এটি সাধারণত হবে) ) তারপরে পিআইডি সিস্টেম দ্বারা পুনরায় ব্যবহারের জন্য মুক্ত হয়।

আপনি ইস্যু করলে initctl stop <service>বা service <service> stop, initctlপরের বার উপস্থিত হওয়ার পরে সেই পিআইডি মেরে ফেলবে। এর অর্থ হ'ল, কোথাও রাস্তার নিচে যদি আপনি এই ভুলটি করার পরেও রিবুট না করেন তবে পিআইডি ব্যবহারের পরবর্তী প্রক্রিয়াটি তাত্ক্ষণিকভাবে মারা যাবে initctlযদিও এটি ডিমন হবে না be এটি এতটা সহজ catবা জটিল হিসাবে কিছু হতে পারে ffmpegএবং আপনার সফ্টওয়্যার প্যাকেজটি কিছু রুটিন ক্রিয়াকলাপের মাঝখানে কেন ক্র্যাশ হয়েছিল তা জানার জন্য আপনার খুব কষ্ট হবে।

সুতরাং, সমস্যাটি হ'ল আপনি expectআপনার ডেমন প্রক্রিয়াটি আসলে কাঁটা সংখ্যার জন্য ভুল বিকল্পটি নির্দিষ্ট করেছেন । তারা বলে যে এখানে একটি আপস্টার্ট পুনর্লিখন আছে যা এই সমস্যাটিকে সম্বোধন করে, তবে আপস্টার্ট ১.৮ হিসাবে (সর্বশেষ উবুন্টু ১৩.০৪ / জানুয়ারী ২০১৪) সমস্যাটি এখনও উপস্থিত রয়েছে is

আপনি যেহেতু expect daemonএই সমস্যাটি ব্যবহার করেছেন এবং শেষ করেছেন তাই আমি চেষ্টা করার চেষ্টা করছি expect fork

সম্পাদনা: এখানে একটি উবুন্টু BASH- সামঞ্জস্যপূর্ণ স্ক্রিপ্ট ( উবুন্টু ব্যবহারের জন্য সংশোধিত ওয়েড ফিটজপ্যাট্রিক দ্বারা নির্মিতsleep ) উপলব্ধ প্রক্রিয়া আইডি ঠিকানার স্থান শেষ না হওয়া অবধি প্রক্রিয়াগুলিকে উত্সাহিত করে, এটি 0 এ ফিরে শুরু হয় এবং "আটকে" যাওয়ার পথে কাজ করে PID,। তারপরে পিআইডি-তে একটি প্রক্রিয়া তৈরি হয় initctlএবং initctlএটি মেরে ফেলে এবং পুনরায় সেট করে।

#!/bin/bash

# usage: sh /tmp/upstart_fix.sh <pid>

sleep 0.001 &
firstPID=$!
#first lets exhaust the space
while (( $! >= $firstPID ))
do
    sleep 0.001 &
done

# [ will use testPID itself, we want to use the next pid
declare -i testPID
testPID=$(($1 - 1))
while (( $! < $testPID ))
do
    sleep 0.001 &
done

# fork a background process then die so init reaps its pid
sleep 3 &
echo "Init will reap PID=$!"
kill -9 $$
# EOF

এই উত্তরের কিছু দরকারী এবং আকর্ষণীয় তথ্য রয়েছে তবে এটি আমার কাছে অস্পষ্ট যে এই উত্তরটি উত্তর প্রশ্নের উত্তর হিসাবে কীভাবে @ অঞ্জন উল্লেখ করেছে যে "আমি ডিমন প্রত্যাশার পরিবর্তে প্রত্যাশা কাঁটাচামচ দিয়ে চেষ্টাও করেছি। আমি প্রত্যাশা ... লাইন সম্পূর্ণরূপে অপসারণের চেষ্টাও করেছি। "
ব্যবহারকারী 12345

5

প্রদত্ত উদাহরণের জন্য:

$ initctl status bluepill
bluepill start/running, process 990

আমার জন্য দ্রুত সমাধানটি হ'ল:

# If upstart gets stuck for some job in stop/killed state
export PID=990
cd /usr/local/bin
wget https://raw.github.com/ion1/workaround-upstart-snafu/master/workaround-upstart-snafu
chmod +x workaround-upstart-snafu
./workaround-upstart-snafu $PID

উত্স: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=582745#37

আমি আশা করি এটি সহায়ক হবে। যা চলছে তা অন্যান্য উত্তরে ব্যাখ্যা করা হয়েছে।


দুর্দান্ত স্ক্রিপ্ট। এটি এক বা দুই মিনিট সময় নিতে পারে। একটি rebootকখনও কখনও পছন্দনীয় হতে পারে এবং এটি ঠিকও করে।
পিটার Ilfrich

0

আপনি যদি না কোনও আপস্টার্ট ব্যবহারকারী স্তরের কাজ চালাচ্ছেন বা সেটুইড স্তবনা ব্যবহার করছেন না - তবে আপনার কাজটি মূল হিসাবে চলমান।

যেহেতু আপস্টার্ট ইতিমধ্যে রুট হিসাবে চলছে, আপনার execস্তবনায় আপনার কেনো সুডো ব্যবহারের প্রয়োজন ?

ব্যবহার sudoবা suমধ্যে execআমার জন্য স্তবক কারণে একই সমস্যা হিসাবে আপনি এখানে আলোচনা করা হয়েছে।

সাধারণত আমি 1 বা 2 এবং আইটেম 1 টি অভিজ্ঞতা করব:

  1. upstart ভুল পিআইডি অনুসরণ করে
  2. আমি প্রক্রিয়াটি থামানোর চেষ্টা করার সময় আপস্টার্ট স্তব্ধ হয়ে যায়

অবশ্যই, অতিরিক্তভাবে আপনার অবশ্যই expectস্তবকে কাঁটাচামড়ার সঠিক সংখ্যা প্রতিফলিত করতে হবে ।

ওয়াইএমএমভি, তবে আমার জন্য:

  • execনির্দিষ্ট স্তরের সঠিক সংখ্যার সাথে স্তরে সূডো বা স্যু ব্যবহার করা সাধারণভাবে উপরের পরিস্থিতি 1-এ ফলাফল করে।
  • নির্দিষ্ট সংখ্যক কাঁটাচামচ (আমাদের সাথে sudo / su ছাড়া exec) ফলাফল 1 ও 2 এর উপরে অবস্থিত।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.