ทำไมคนธรรมดาถึงคอยรับผิดชอบกระบวนการของฉัน


19

ฉันเขียนสคริปต์ upstart เพื่อเปิด daemon ภายในเซสชัน tmux มันทำงานได้ดีและตอบสนองต่อกระบวนการหากมันตายโดยไม่คาดคิด แต่ฉันไม่สามารถหยุดได้ด้วยตนเอง

งาน (เรียกว่า bukkit) มีลักษณะเช่นนี้:

start on filesystem
stop on runlevel [!2345]

respawn
respawn limit 5 30

chdir /home/minecraft/bukkit

expect daemon
kill timeout 30

pre-start script
    test -x /home/minecraft/bukkit/craftbukkit-0.0.1-SNAPSHOT.jar || { stop; exit 0; }
end script

pre-stop script
    tmux send -t bukkit "stop"
    tmux send -t bukkit "Enter"
    sleep 10  # Wait for server to shut down properly
end script

exec tmux new-session -d -s minecraft -n bukkit "sudo -u minecraft -- /home/minecraft/java/jre1.6.0_27/bin/java -Xincgc -Xmx1G -jar /home/minecraft/bukkit/craftbukkit-0.0.1-SNAPSHOT.jar"

เมื่อฉันออกstop bukkitมันค้างสำหรับ ~ 10 วินาที (เวลาปิดฉันเดา) bukkit start/running, process 2391และภาพพิมพ์ เมื่อฉันตั้งค่าเริ่มต้นให้ดีบั๊กฉันพบบรรทัดที่เกี่ยวข้องเหล่านี้ในบันทึก:

Sep 21 19:14:59 cheftest init: bukkit goal changed from start to stop
Sep 21 19:14:59 cheftest init: bukkit main process (2499) exited normally
Sep 21 19:14:59 cheftest init: bukkit main process ended, respawning
Sep 21 19:14:59 cheftest init: bukkit goal changed from stop to respawn

ทำไมคนธรรมดาถึงคอยตอบสนองกระบวนการของฉันเมื่อมันควรจะหยุดมัน?

คำตอบ:


23

ความยากลำบากที่นี่คือการรวมกันของ 'respawn' กับสคริปต์ก่อนหยุดที่บอกให้กระบวนการหยุด จาก init (5):

   respawn
         A service or task with this stanza will be automatically started
         if it should stop abnormally.  All reasons for a service stopping,
         except the stop(8) command itself, are considered abnormal.  Tasks
         may exit with a zero exit status to prevent being respawned.

เอกสารไม่ชัดเจนในจุดที่ว่าการออกด้วยสถานะทางออกเป็นศูนย์ควรทำให้เกิดใหม่หรือไม่ อย่างไรก็ตามโดยพื้นฐานแล้วคุณพบข้อผิดพลาดพุ่งพรวดเนื่องจากกระบวนการหลักสิ้นสุดลงเมื่อเป้าหมายคือ 'หยุด' ไม่ควรส่งผลให้เกิดการเปลี่ยนเป็น 'respawn'

ในการหลีกเลี่ยงข้อผิดพลาดนี้คุณควรใช้ "ทางออกปกติ" เพื่อแจ้งให้ทราบล่วงหน้าว่านี่เป็นวิธีปกติในการหยุดงานและไม่ควรเกิดใหม่

  normal exit STATUS|SIGNAL...
         Additional exit statuses or even signals may be added, if the
         job process terminates with any of these it will not be considered
         to have failed and will not be respawned.

         normal exit 0 1 TERM HUP

โปรดทราบว่าโดยทั่วไปจะมีประสิทธิภาพมากกว่าที่จะฆ่ากระบวนการด้วยสัญญาณ (ระบุ "kill signal N" หากจำเป็น) แทนการใช้กระบวนการหยุดก่อนที่จะออกคำสั่ง แต่แน่นอนว่านี่อาจเป็นไปไม่ได้เสมอไปถ้าบริการไม่รองรับการปิดระบบใหม่ทั้งหมดเมื่อได้รับสัญญาณ


ขอบคุณการแก้ไขปัญหาใช้งานได้ดีกับกรณีของฉัน ฉันพบรายงานข้อผิดพลาดสำหรับสิ่งนี้ แต่ดูเหมือนว่าพฤติกรรมนี้ได้รับการออกแบบอย่างมีสติ
passy

คำตอบก็อตต์เจมส์เศษเล็กเศษน้อยของมีที่ถูกต้อง - มันเป็นข้อผิดพลาดที่ไม่ตัดสินใจการออกแบบกรณีทดสอบที่อ้างถึงหมายถึงบางสิ่งบางอย่างการทดสอบอื่น :)
slangasek

3

ในกรณีที่คนอื่นสิ้นสุดลงที่นี่ฉันได้ส่งแพทช์การทำงานไปที่ข้อบกพร่อง:

https://bugs.launchpad.net/upstart/+bug/568288/comments/6


ยินดีต้อนรับสู่ถาม Ubuntu! ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Peachy

2

แก้ไขได้รับการปล่อยตัวในพุ่งพรวด 1.10 สำหรับเรื่องนี้ดังนั้นตอนนี้มันไม่ควรเกิดขึ้น


สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้แต่งโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
amc

2
ฉันไม่แน่ใจอย่างสมบูรณ์ คำตอบของฉันเทียบเท่ากับการพูดว่า: มันเกิดขึ้นเพราะคุณกำลังใช้เวอร์ชั่นเก่าที่พุ่งพรวดซึ่งมีบั๊กให้ใช้เวอร์ชั่น 1.10 หรือใหม่กว่าเพื่อแก้ไข สิ่งที่ไม่มีคำตอบอื่นใดระบุและจริง ๆ แล้วเป็นคำตอบที่มีประโยชน์ที่สุดตอนนี้การแก้ไขได้รับการเผยแพร่แล้วและมีเหตุผลเพียงเล็กน้อยสำหรับวิธีแก้ปัญหา
cprcrack

ผมเห็นมันมีประโยชน์ แต่ฉันคิดว่ามันเป็นประโยชน์มากขึ้นเป็นความคิดเห็นที่จะเป็นคำตอบที่ได้รับการยอมรับ
บบส.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.