การพุ่งพรวดการติดตาม PID ที่ไม่ถูกต้องของกระบวนการ - ไม่ตอบสนอง


11

ฉันแรกถามคำถามนี้ใน StackOverflow จากนั้นตระหนักว่านี่น่าจะเป็นสถานที่ที่ดีกว่า

ฉันมีการตั้งค่า bluepill เพื่อตรวจสอบกระบวนการล่าช้าของฉัน (แอปพลิเคชัน Ruby On Rails)

ใช้ Ubuntu 12.10

ฉันเริ่มต้นและการตรวจสอบการให้บริการ bluepill 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...สายอย่างสมบูรณ์

เมื่อบู๊ตเครื่อง bluepill ก็เริ่มทำงานได้ดี

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

PID ของกระบวนการ bluepill คือ 1154 ที่นี่ แต่upstartดูเหมือนว่าจะติดตาม PID ที่ไม่ถูกต้อง มันกำลังติดตาม PID ซึ่งไม่มีอยู่

$ initctl status bluepill
bluepill start/running, process 990

ฉันคิดว่ามันกำลังติดตาม PID ของsudoกระบวนการซึ่งเริ่มกระบวนการ bluepill

นี้จะป้องกันไม่ให้กระบวนการ bluepill จากการ respawned ถ้าฉันฆ่าอย่างแข็งขัน bluepill kill -9ใช้

ยิ่งกว่านั้นฉันคิดว่าเนื่องจากการติดตาม PID ที่ไม่ถูกต้องการรีบูต / ปิดเครื่องก็ค้างและฉันต้องรีเซ็ตเครื่องอย่างหนักทุกครั้ง

สิ่งที่อาจเป็นปัญหาที่นี่?

อัปเดต :

ปัญหายังคงมีอยู่ ณ วันนี้ (3 พฤษภาคม 2558) บน Ubuntu 14.04.2

ปัญหาไม่ได้เกิดจากการใช้ sudo ฉันไม่ได้ใช้ sudo อีกต่อไป การกำหนดค่าเริ่มต้นที่อัปเดตของฉันคือ:

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

เมื่อบูทเครื่องโปรแกรมจะโหลดขึ้นมา แต่คนธรรมดายังคงติดตาม PID ผิดดังที่อธิบายไว้ข้างต้น

วิธีแก้ปัญหาที่กล่าวถึงในความคิดเห็นอาจแก้ไขปัญหาการหยุด ฉันยังไม่ได้ลองเลย


คุณลองดูที่กระบวนการ 990 แล้วหรือยัง ps aux | grep 990ควรทำ แต่pstree 990อาจมีข้อมูลมากขึ้น
Oli

ไม่มีกระบวนการที่มี PID ของ 990 อยู่
Anjan

2
เท่าที่จำเป็นในการรีบูตเพื่อกลับไปสู่สถานะที่ดี - ดูเครื่องมือที่ยอดเยี่ยมนี้: github.com/ion1/workaround-upstart-snafu
andersonbd1

และคุณสามารถเร่งความเร็วเครื่องมือด้วยคำสั่งนี้: $ echo 3000 | sudo tee / proc / sys / kernel / pid_max
andersonbd1

คำตอบ:


8

ค่อนข้างช้า แต่หวังว่านี่จะช่วยผู้ใช้รายอื่นได้

มีข้อผิดพลาดที่เป็นเอกสารในการพุ่งพรวดซึ่งอาจทำให้ initctl ติดตาม PID ที่ไม่ถูกต้องหากคุณระบุ stanza ที่ไม่ถูกต้องforkในการกำหนดค่าเริ่มต้น: https://bugs.launchpad.net/upstart/+bug/406397

สิ่งที่เกิดขึ้นคือการพุ่งพรวดจะตรวจสอบforkstanza และกำหนดว่าจะทำการตรวจสอบกระบวนการ fork จำนวนเท่าใดก่อนเลือก PID "จริง" ของโปรแกรมที่ถูกควบคุม หากคุณระบุexpect forkหรือexpect daemonแต่โปรแกรมของคุณแยกจำนวนครั้งไม่เพียงพอstartจะหยุดทำงาน หากกระบวนการของคุณใช้เวลานานเกินไปinitctlจะติดตาม PID ที่ไม่ถูกต้อง ในทางทฤษฎีควรมีการบันทึกไว้ในส่วนนี้ของตำราอาหารพุ่งพรวดแต่อย่างที่คุณเห็นในสถานการณ์นี้มี PID ที่เกี่ยวข้องกับกระบวนการฆ่าเมื่อไม่ควรมี

ความหมายของสิ่งนี้มีการอธิบายไว้ในข้อคิดเห็นข้อคิดเห็นของตัวติดตาม แต่ฉันจะสรุปที่นี่: นอกจากinitctlจะไม่สามารถหยุดกระบวนการภูตและติดอยู่ในสถานะที่ไม่มีเอกสาร / ผิดกฎหมาย<service> start/killed, process <pid>หากกระบวนการที่เป็นของ PID หยุดลง (และโดยปกติจะ ) จากนั้น PID จะถูกปล่อยให้เป็นอิสระสำหรับระบบอีกครั้ง

ถ้าคุณออกinitctl stop <service>หรือservice <service> stop, initctlจะฆ่าว่า PID ในครั้งต่อไปก็จะปรากฏขึ้น นั่นหมายความว่าหากคุณไม่รีบูทหลังจากทำผิดพลาดขั้นตอนต่อไปในการใช้ PID นั้นจะถูกฆ่าทันทีinitctlแม้ว่ามันจะไม่ใช่ภูตก็ตาม อาจเป็นอะไรที่ง่ายcatหรือซับซ้อนffmpegและคุณอาจมีเวลาลำบากในการหาสาเหตุที่แพคเกจซอฟต์แวร์ของคุณทำงานล้มเหลวในระหว่างการดำเนินการตามปกติ

ดังนั้นปัญหาคือคุณระบุexpectตัวเลือกที่ไม่ถูกต้องสำหรับจำนวนส้อมกระบวนการ daemon ของคุณทำจริง พวกเขาบอกว่ามีการเขียนซ้ำแบบพุ่งพล่านที่แก้ไขปัญหานี้ แต่ในขณะที่การพุ่งพรวด 1.8 (Ubuntu ล่าสุด 13.04 / มกราคม 2014) ปัญหายังคงมีอยู่

เนื่องจากคุณใช้และจบลงด้วยปัญหานี้ผมขอแนะนำให้พยายามexpect daemonexpect fork

แก้ไข: ต่อไปนี้เป็นสคริปต์ที่เข้ากันได้กับ Ubuntu BASH ( ต้นฉบับโดย Wade Fitzpatrickดัดแปลงเพื่อใช้งาน Ubuntu sleep) ที่วางกระบวนการจนกว่ากระบวนการที่อยู่ ID กระบวนการที่มีอยู่จะหมดไปซึ่งจะเริ่มต้นที่ 0 และทำงานจนถึง "ติดขัด" PID กระบวนการจะถูกวางไข่ที่ 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

คำตอบนี้มีข้อมูลที่เป็นประโยชน์และน่าสนใจ แต่ก็ไม่มีความชัดเจนสำหรับฉันว่าคำตอบนี้ตอบคำถามเริ่มต้นอย่างไร @Anjan พูดถึง"ฉันได้ลองใช้ fork fork แทนที่จะเป็น daemon คาดหวังฉันได้ลองลบสาย ... ทั้งหมดด้วย "
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บางครั้งอาจจะดีกว่าและยังแก้ไขนี้
Peter Ilfrich

0

หากคุณไม่ได้รันงานในระดับผู้ใช้พุ่งพรวดหรือใช้ setuid stanza - งานของคุณจะทำงานเป็นรูท

เนื่องจากพุ่งพรวดทำงานเป็นรากแล้วทำไมคุณต้องใช้ sudo เลยในexecบทของคุณ?

การใช้sudoหรือsuในexecstanza ทำให้ฉันมีปัญหาเช่นเดียวกับที่คุณอธิบายที่นี่

โดยปกติแล้วฉันจะพบรายการ 1 หรือทั้ง 1 และ 2:

  1. พุ่งพรวดตาม PID ที่ไม่ถูกต้อง
  2. พุ่งพรวดแฮงค์เมื่อฉันพยายามที่จะหยุดกระบวนการ

แน่นอนยิ่งไปกว่านั้นคุณจะต้องมีexpectบทที่สะท้อนให้เห็นถึงจำนวนที่ถูกต้องของส้อม

YMMV แต่สำหรับฉัน:

  • ใช้ sudo หรือ su ในexecstanza ด้วยจำนวน forks ที่ถูกต้องที่ระบุโดยทั่วไปส่งผลให้ในสถานการณ์ 1 ข้างต้น
  • จำนวนส้อมที่ระบุไม่ถูกต้อง (ด้วยของเราโดยไม่มี sudo / su ในexec) ผลลัพธ์ในสถานการณ์ 1 และ 2 ข้างต้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.