प्रक्रिया की गलत पीआईडी ​​को ट्रैक करना - श्वसन नहीं


11

मैंने मूल रूप से StackOverflow पर यह प्रश्न पूछा था। तब एहसास हुआ कि यह शायद एक बेहतर जगह है।

मेरी विलंबित प्रक्रिया को मॉनिटर करने के लिए मेरे पास ब्लूपिल सेटअप है। (रेल आवेदन पर रूबी)

Ubuntu 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लगता है कि गलत PID को ट्रैक कर रहा है। यह एक पीआईडी ​​पर नज़र रख रहा है जो मौजूद नहीं है।

$ initctl status bluepill
bluepill start/running, process 990

मुझे लगता है कि यह उस sudoप्रक्रिया के पीआईडी ​​को ट्रैक कर रहा है जिसने ब्लूपील प्रक्रिया शुरू की थी।

अगर मैं जबरदस्ती ब्लूपिल का उपयोग कर रहा हूं, तो यह ब्लूपिल प्रक्रिया को सांस लेने से रोक रहा है kill -9

इसके अलावा, मुझे लगता है कि गलत PID के ट्रैक होने के कारण, रिबूट / शटडाउन बस हैंग हो जाता है और मुझे हर बार मशीन को हार्ड रीसेट करना पड़ता है।

यहां क्या मुद्दा हो सकता है?

अद्यतन :

यह समस्या उबंटू 14.04.2 को आज (3 मई 2015) तक बनी हुई है।

समस्या सूडो का उपयोग करने के कारण नहीं है। मैं अब सूडो का उपयोग नहीं कर रहा हूं। मेरा अपडेट किया हुआ अपस्टार्ट कॉन्फिगर यह है:

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 के पीआईडी ​​के साथ कोई प्रक्रिया मौजूद नहीं है।
अंजन

2
जहाँ तक एक अच्छे राज्य में वापस ऊपर उठने के लिए रीबूट करने की आवश्यकता है - इस अच्छे टूल को देखें: github.com/ion1/workaround-upstart-snafu
andersonbd1

और आप इस टूल को इस कमांड से गति दे सकते हैं: $ echo 3000 | सूदो टी / proc / sys / कर्नेल / pid_max
andersonbd1

जवाबों:


8

काफी देर से, लेकिन उम्मीद है कि यह अन्य उपयोगकर्ताओं के लिए मदद का हो सकता है।

अपस्टार्ट में एक डॉक्युमेंटेड बग है, जो गलत पीआईडी ​​को ट्रैक करने के लिए initctl का कारण बन सकता है यदि आप forkएक अपस्टार्ट कॉन्फिगर में गलत श्लोक निर्दिष्ट करते हैं : https://bugs.launchpad.net/upstart/+bug/40x397

ऐसा होता है कि अपस्टार्ट, forkश्लोक की जाँच करता है और यह निर्धारित करता है कि कार्यक्रम के "सही" पीआईडी ​​को नियंत्रित करने से पहले कितनी जाली प्रक्रियाओं की जाँच करनी चाहिए। यदि आप निर्दिष्ट करते हैं expect forkया करते हैं, expect daemonलेकिन आपका प्रोग्राम पर्याप्त संख्या में फोर्क नहीं करता है, startतो लटका होगा। यदि, दूसरी ओर, आपकी प्रक्रिया कई बार कांटे, initctlगलत पीआईडी ​​को ट्रैक करेगी। सैद्धांतिक रूप से, इसे अपस्टार्ट कुकबुक के इस खंड में प्रलेखित किया जाना चाहिए , लेकिन जैसा कि आप इस स्थिति में देख सकते हैं कि मारे गए प्रक्रिया से जुड़ा एक पीआईडी ​​है जब नहीं होना चाहिए।

इसके निहितार्थों को बगट्रैकर टिप्पणियों में समझाया गया है, लेकिन मैं यहां संक्षेप में बताऊंगा: इसके अलावा initctlडेमन प्रक्रिया को रोकने में सक्षम नहीं होने और एक अनिर्दिष्ट / अवैध स्थिति में फंसने के कारण <service> start/killed, process <pid>, यदि उस पीआईडी ​​से संबंधित प्रक्रिया बंद हो जाती है (और यह आमतौर पर होता है) ) तब सिस्टम द्वारा पुन: उपयोग के लिए पीआईडी ​​को मुक्त कर दिया जाता है।

यदि आप जारी करते हैं initctl stop <service>या service <service> stop, initctlअगली बार दिखाई देने पर उस PID को मार देंगे। इसका मतलब यह है कि, यदि आप इस गलती को करने के बाद रिबूट नहीं करते हैं, तो सड़क के नीचे, पीआईडी ​​का उपयोग करने की अगली प्रक्रिया तुरंत ही समाप्त हो जाएगी initctl, हालांकि यह डेमॉन नहीं होगा। यह उतना ही सरल catया उतना ही जटिल हो सकता है ffmpeg, और आपको यह पता लगाने में कठिन समय होगा कि आपका सॉफ़्टवेयर पैकेज कुछ रूटीन ऑपरेशन के बीच में क्रैश क्यों हुआ।

तो, मुद्दा यह है कि आपने expectअपनी डेमॉन प्रक्रिया वास्तव में बनाता है कांटे की संख्या के लिए गलत विकल्प निर्दिष्ट किया है । वे कहते हैं कि इस मुद्दे को संबोधित करने वाला एक अपस्टार्ट फिर से लिखा गया है, लेकिन अपस्टार्ट 1.8 (नवीनतम Ubuntu 13.04 / जनवरी 2014) के अनुसार यह मुद्दा अभी भी मौजूद है।

चूंकि आपने expect daemonइस मुद्दे का इस्तेमाल किया और समाप्त किया , इसलिए मैं कोशिश करने की सलाह देता हूं expect fork

संपादित करें: यहां एक उबंटू बीएश-संगत स्क्रिप्ट ( वाडे फिट्ज़पैट्रिक द्वारा मूल उबंटू का उपयोग करने के लिए संशोधित किया गया है 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

इस उत्तर में कुछ उपयोगी और दिलचस्प जानकारी है, हालांकि यह मेरे लिए स्पष्ट नहीं है कि यह उत्तर प्रारंभिक प्रश्न का उत्तर कैसे देता है क्योंकि @Ajan ने उल्लेख किया है "मैंने भी डेमॉन की अपेक्षा उम्मीद कांटे के साथ कोशिश की है। मैंने भी उम्मीद को हटाने की कोशिश की है ... पूरी तरह से लाइन। "
user12345

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कभी-कभी बेहतर हो सकता है और यह भी ठीक करता है।
पीटर इलफ्रीक

0

जब तक आप उपस्टार्ट उपयोगकर्ता स्तर की नौकरी नहीं चला रहे हैं या सेट्यूड श्लोक का उपयोग कर रहे हैं - तब आपकी नौकरी जड़ के रूप में चल रही है।

चूंकि उपस्टार्ट पहले से ही जड़ के रूप में चल रहा है, आपको अपने execश्लोक में सूडो का उपयोग करने की आवश्यकता क्यों है ?

का उपयोग करना sudoया suमें execमेरे लिए छंद का कारण है एक ही समस्याओं के रूप में आप यहाँ वर्णन करते हैं।

आमतौर पर मुझे आइटम 1 या दोनों 1 और 2 का अनुभव होगा:

  1. upstart गलत PID का अनुसरण करता है
  2. जब मैं प्रक्रिया को रोकने की कोशिश करता हूं, तो upstart लटक जाता है

बेशक, इसके अतिरिक्त आपके पास expectछंद होना चाहिए जिसमें कांटे की सही संख्या हो।

YMMV, लेकिन मेरे लिए:

  • स्टैंज़ा में सूडो या सु का उपयोग करके execनिर्दिष्ट संख्या में कांटे की सही संख्या के साथ आम तौर पर स्थिति 1 में परिणाम होता है।
  • execऊपर दिए गए 1 और 2 की स्थिति में निर्दिष्ट (हमारे sudo / su के बिना ) के साथ निर्दिष्ट कांटे की गलत संख्या ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.