วิธีง่ายๆในการรีสตาร์ทกระบวนการที่ล้มเหลว?


10

ฉันต้องตรวจสอบกระบวนการต่างๆที่ทำงานอยู่บนเว็บเซิร์ฟเวอร์ของฉัน ด้วยเหตุผลบางอย่างวานิชก็ขัดข้องหนึ่งครั้งทุกวันหรือสองวัน ฉันใช้ monit เพื่อเริ่มการเคลือบเงาใหม่โดยอัตโนมัติ แต่มันไม่ทำงาน นี่คือรายการ monit.conf ของฉันสำหรับวานิช

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

ไฟล์บันทึกแสดงว่าหลังจากเคลือบเงาหยุดทำงานความพยายามในการรีสตาร์ทจะล้มเหลวหลังจากนั้นทั้งหมด ในที่สุดก็หยุดการตรวจสอบวานิช

ใครมีคำแนะนำสำหรับฉันจะแก้ไขได้อย่างไร หรือยังดีกว่าคุณสามารถแนะนำวิธีง่ายๆอื่น ๆ ในการตรวจสอบและรีสตาร์ทกระบวนการที่ล้มเหลวโดยอัตโนมัติได้หรือไม่? ขอบคุณ!


ฉันไม่อยากเชื่อเลยว่าสิ่งเหล่านี้ยากเพียงใดในช่วงก่อนระบบ
Fl0v0

คำตอบ:


17

ฉันจะดูใน daemontools ( http://cr.yp.to/daemontools.html )

การกำกับดูแลถูกสร้างขึ้นเพื่อจุดประสงค์นี้โดยเฉพาะ - เพื่อเริ่มกระบวนการและดูพวกเขาเริ่มต้นใหม่ทันทีหากพวกเขาเคยยุติ

คุณยังคงสามารถใช้ monit ได้หากคุณต้องการทำอะไรที่ซับซ้อนมากกว่าการตรวจสอบ "มันยังทำงานอยู่" และถ้ากระบวนการต้องเริ่มต้นใหม่ให้ทำผ่านการควบคุม


ฉันใช้ daemontools ด้วยสำหรับการตรวจสอบกระบวนการบริการที่ไม่เสถียร ค่อนข้างมีประโยชน์ถ้าฉันต้องพูด :-)
edomaur


2

คุณสามารถใช้สคริปต์ตัวจัดการเหตุการณ์กับ Nagiosหากคุณมีสคริปต์นั้นเพื่อเริ่มบริการใหม่

ถ้าวานิชต้องการการอนุญาตให้รูทเริ่มต้น (ปกติสคริปต์ init.d) ให้เปลี่ยน "/etc/init.d/varnish start" เป็น "sudo /etc/init.d/varnish start" แต่นั่นอาจจะไม่เพียงพอเนื่องจากคุณอาจไม่ต้องการให้สิ่งใดก็ตามที่ผู้ใช้เรียกใช้ตามสิทธิ์ทั้งหมดของ sudo nopasswd สำหรับคำสั่งทั้งหมดและการให้ sudo กับเชลล์สคริปต์นั้นโดยทั่วไปจะไม่ดี ดังนั้นคุณจะต้องคิดออกว่าคำสั่งใดในสคริปต์ init นั้นต้องการ sudo ให้สิทธิ์ sudo คำสั่งเหล่านั้นในไฟล์ / etc / sudoers แก่ผู้ใช้ monit และสุดท้ายก็แก้ไขสคริปต์ init นั้นตามลำดับ หรืออาจจะแทนที่จะเรียกใช้วานิชทั้งหมดนี้ในฐานะผู้ใช้ที่ไม่ใช่รูท

ในที่สุดฉันแน่ใจว่าคุณรู้เรื่องนี้ แต่ฉันจะพูดมันต่อไป คุณพยายามอย่างมากในการทำสิ่งนี้ฉันหวังว่าคุณจะพยายามอย่างมากในการหาสาเหตุที่น้ำยาวานิชหยุดทำงานและทำการแก้ไขจริง ๆ (หรือทำให้นักพัฒนาเกิดความเข้าใจว่าทำไม) :-)

อัปเดต:
สิ่งนี้อาจไม่สะอาด แต่วิธีง่ายๆในการทำให้เสร็จเนื่องจากรูทอาจจะตั้งค่าสคริปต์ที่ตรวจสอบว่ากระบวนการนั้นดีหรือไม่และหากไม่ได้เริ่มต้น จากนั้นเพียงเรียกใช้สคริปต์นั้นทุก ๆ สองสามนาทีเป็นงาน cron


ตอนแรกฉันพิจารณา Nagios แต่ต้องการบางสิ่งที่เล็กและเรียบง่ายสำหรับจุดประสงค์ของฉัน และใช่ฉันกำลังมองหาปัญหาวานิช เซิร์ฟเวอร์ตัวใดตัวหนึ่งของฉันทำงานได้เสถียรเป็นเวลานานมากดังนั้นมันจึงต้องทำกับฉันอย่างแน่นอน :(
หลิน

1

อีกวิธีที่ยอดเยี่ยมนำมาจาก StackOverflow :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

สามารถเพิ่มลงใน crontab ได้:

crontab -e

จากนั้นเพิ่มกฎเพื่อเริ่มสคริปต์ตรวจสอบของคุณ:

@reboot /usr/local/bin/myservermonitor

หรือเพิ่มเป็นสคริปต์ใน /etc/init.d

ดูคำตอบของ StackOverflowสำหรับคำอธิบายโดยละเอียดว่าทำไมจึงเป็นวิธีที่ดี


0

ฉันกำลังมองหาวิธีที่ง่ายที่สุดในการจัดการปัญหานี้ วิธีที่ง่ายที่สุดที่ฉันสามารถหาได้คือเพิ่มไฟล์ที่Restart=allwaysเกี่ยวข้องลงไป.serviceใน/etc/systemd/system/multi-user.target.wants/บรรทัดสุดท้ายของ[service]แท็ก

หลังจากนั้นsudo systemctl daemon-reloadตามด้วยsudo systemctl restart service.serviceการโหลดการเปลี่ยนแปลงอีกครั้ง

คุณสามารถทดสอบโดยการตรวจสอบว่าบริการกำลังทำงานอยู่: systemctl status processnameตรวจสอบเวลาเริ่มต้น หลังจากนั้นทำps -ef | grep servicenameโฆษณาฆ่ากระบวนการด้วย kill 1234ID หลังจากนั้นทำsystemctl status processnameอีกครั้งและตรวจสอบว่าการประทับเวลาเริ่มต้นมีการปรับปรุง

ควรทำงานกับ:

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