วิธีตรวจสอบบริการและรีสตาร์ทถ้าหยุดใน Linux


24

จริงๆแล้วฉันไม่แน่ใจว่าฉันควรใช้ Shell Scripts หรือไม่ แต่วิธีการใดก็ตามที่เราใช้ฉันต้องการให้บริการยังคงทำงานอยู่ตลอดเวลา

สมมติว่าiptablesเป็นตัวอย่าง จากนั้น ..

  • เมื่อใดก็ตามที่iptablesบริการไม่ได้stopped(หรือกล่าวอีกนัยหนึ่ง) ไม่ได้ทำงานฉันต้องการให้มันเป็นstarted(หรือrestarted) .. โดยอัตโนมัติทุกครั้งที่มันหยุดทำงาน (หรือไม่ทำงาน)
  • ในคำอื่น ๆ ที่เรียบง่ายกว่านี้ฉันต้องการให้บริการและทำงานตลอดเวลา

(อาจเป็นฉันสามารถให้ความถี่ที่เป็นธรรมในการตรวจสอบถ้าทำการตรวจสอบเรียลไทม์เป็นปัญหาดังนั้นขอพูดทุก ๆ 5 นาที)

วิธีเดียวที่ฉันคิดได้คือใช้ Shell Scripts กับ Cron Tab

  • มีวิธีแก้ปัญหาที่ชาญฉลาดบ้างไหม?

ขอบคุณ!


คุณไม่ควรทำอย่างนั้น สมมติว่าบริการมีการกำหนดค่าไม่ดีกลยุทธ์ของคุณจะบรรลุผลอย่างไร รายการรีทรีตที่ไม่มีที่สิ้นสุด คุณควรเขียนสคริปต์ crontab แทนว่าalertsคุณไม่สามารถทำงานได้
MariusMatutiae

ฉันแค่อยากรู้เกี่ยวกับคำตอบที่ตรงประเด็นสำหรับคำถามดั้งเดิม และฉันยังมีบริการที่จะต้องเป็นเพียงแค่restartedทุกครั้งที่มันหยุดด้วยเหตุผลใดก็ตาม ไม่มีปัญหากับการรีสตาร์ท
夏期劇場

1
โซลูชันที่แนะนำของคุณเองนั้นฉลาดพอ หากคุณใช้อย่างถูกต้อง (ออกทันทีหากบริการกำลังทำงานอยู่ให้เตือนคุณว่าบริการหยุดทำงานเพื่อให้คุณสามารถแก้ไขได้และอื่น ๆ .... ) เป็นวิธีที่ง่ายที่สุด บริการที่หยุดทำงานโดยอัตโนมัติเป็นบริการที่มีปัญหาดังนั้นในที่สุดคุณควรแก้ไข แต่ไม่เช่นนั้นในฐานะแพตช์ชั่วคราวสคริปต์ cron หรือดีมอนที่เรียบง่ายอีกตัวที่ใช้เวลาส่วนใหญ่จะทำงานได้ดี มีเครื่องมือบางอย่างเช่นmmonit.com/monitแต่ฉันคิดว่าในท้ายที่สุดพวกเขาทุกคนใช้วิธีการที่คล้ายกัน

@MariusMatutiae ฉันเห็นด้วยกับประเด็นของคุณ แต่มันขึ้นอยู่กับลักษณะของการบริการและผู้จัดการกระบวนการส่วนใหญ่จะกลับมาอีกครั้งหลังจากการรีสตาร์ทล้มเหลวหลายครั้ง มันสมเหตุสมผลอย่างสมบูรณ์แบบสำหรับกระบวนการที่จะสิ้นสุดตามธรรมชาติและสำหรับเราที่ต้องการเริ่มต้นใหม่โดยอัตโนมัติเช่นคนงานที่รับงานจากคิวและจบลงหลังจากการวิ่งแต่ละครั้ง นอกจากนี้ยังเป็นเครื่องมือที่มีประโยชน์สำหรับ sysadmins ที่ประสบความสำเร็จจากรหัสการรั่วไหลของหน่วยความจำ bespoke - จำกัด อายุการใช้งานของกระบวนการและเริ่มต้นใหม่โดยอัตโนมัติก่อนที่มันจะออกจากมือ ...
Alex Forbes

คำตอบ:


25

อัปเดตมีนาคม 2561

คำตอบนี้ตอนนี้ค่อนข้างเก่าและเนื่องจากมันถูกเขียน systemd ได้รับรางวัล pid1 สงครามบน Linux ดังนั้นคุณควรสร้างหน่วยsystemdหาก systemd ถูกสร้างขึ้นเพื่อการกระจายของคุณ (ซึ่งส่วนใหญ่)

คำตอบด้านล่างถูกสงวนไว้สำหรับคนรุ่นหลัง


คำตอบ monit ข้างต้นนั้นถูกต้อง แต่ฉันคิดว่าฉันจะพูดถึงทางเลือกอื่น:

โปรดทราบว่าระบบปฏิบัติการของคุณได้แก้ไขปัญหาการจัดการกระบวนการแล้ว ตามเนื้อผ้าลินุกซ์ใช้ sysvinit ซึ่งเป็นชุดของสคริปต์ที่คุณเห็นใน init.d อย่างไรก็ตามมันค่อนข้างโง่และไม่สามารถตรวจสอบกระบวนการสคริปต์ init.d มีความซับซ้อนและมันถูกแทนที่ด้วยเหตุผลที่ดี

ระบบปฏิบัติการที่ทันสมัยกว่าเริ่มที่จะแทนที่ sysvinit และ frontrunners คือ Upstart และ Systemd เดเบียนโน้มตัวไปทาง systemd, Ubuntu ได้พัฒนาและเปลี่ยนไปเป็น Upstart แล้วและเหมือน Debian Redhat / CentOS / Fedora กำลังเคลื่อนไปสู่ ​​systemd ดังนั้นหากคุณใช้ระบบปฏิบัติการที่แทนที่ sysvinit แล้วฉันขอแนะนำให้ใช้สิ่งที่มีอยู่ภายใน สคริปต์ง่ายต่อการเขียนมากกว่าสคริปต์เริ่มต้น

ฉันใช้ runit และชอบมันมาก แต่วิธีที่ง่ายที่สุดคือผู้ใช้ นอกจากนี้ยังมีเอกสารที่ดีมากทำงานได้เกือบทุกที่และบรรจุในการแจกแจงหลักทั้งหมด

แต่สิ่งที่คุณทำโปรดได้โปรดอย่าใช้เชลล์สคริปต์ มีหลายสิ่งผิดปกติในแนวทางนี้!


ทำอย่างไรกับ sysvinit
horseyguy

12

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

อย่างไรก็ตามยูทิลิตี้ที่เรียกว่าmonitจะทำสิ่งที่คุณต้องการ ถ้าคุณใช้ Debian มันจะapt-get install monitหายไป มันเกี่ยวข้องกับการเรียนรู้ แต่มีความยืดหยุ่นมาก


3

เรากำลังใช้สคริปต์ง่าย ๆ นี้เพื่อแจ้งเตือนและเริ่มบริการหากไม่ได้ทำงานคุณสามารถเพิ่มบริการเพิ่มเติมได้ ..

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null

จุดของ MariusMatutiae นั้นถูกต้อง แต่เราได้ทำสคริปต์ง่าย ๆ เพื่อตรวจสอบบริการ HTTPD และ DNS ในเซิร์ฟเวอร์ของฉันซึ่งทำงานได้ดี เมื่อใดก็ตามที่บริการไม่ทำงานสคริปต์จะเริ่มบริการใหม่และแจ้งเตือนให้เราทราบเราได้รับการแจ้งเตือน / อีเมลจำนวนมากเกี่ยวกับบริการนี้จากนั้นเราสามารถทำการตรวจสอบได้
Ranjithkumar T

1

โซลูชันทางเลือกสำหรับเดสก์ท็อป (KDE):

เราสามารถรับบริการ aa ด้วยสถานะ Applet / Widget Server ... หลังจากติดตั้งเพียงเพิ่มคำสั่งลงในวิดเจ็ตเพื่อตรวจสอบบริการของคุณ

ตัวอย่าง: systemctl status httpd.service

เวอร์ชั่น KDE 4: https://store.kde.org/content/show.php?content=101336

รุ่น KDE 5: https://store.kde.org/p/1190292/


0

ฉันรู้ว่าเป็นเวลาหลายปีแล้วตั้งแต่มีคนถามคำถาม แต่ด้วย systemd (ส่วนใหญ่พร้อมใช้งานกับ centos และ REHL) คุณสามารถเรียกใช้คำสั่ง bash นี้ด้วย cron เพื่อตรวจสอบและรีสตาร์ทหากบริการไม่ทำงาน

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

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

sudo monitor redis

ถ้าคุณต้องการตรวจสอบบริการ redis และเริ่ม / เริ่มใหม่ถ้าจำเป็น

สุดท้ายของทั้งหมดเพิ่มสิ่งนี้ไปยังงาน cron ของคุณ

หวังว่าจะช่วยได้


0

ในการเพิ่มลงในรายการแบบยาวของการควบคุมดูแล init / svc ในฐานะไดเรกทอรีย่อยของ S6 มีเด็กใหม่อยู่บนบล็อก 66 ที่จัดการการจัดการบริการ s6 และการบันทึกอย่างรวดเร็วเบาและใช้งานง่าย นี่คือลิงค์ไปยังเอกสารอย่างเป็นทางการสำหรับ Obarun-Linux https://web.obarun.org/software

นี่เป็นคำถามที่พบบ่อยเกี่ยวกับวิธีการใช้ซอฟต์แวร์ 66 ตัวนี้และทำความเข้าใจกับ s6 http://sysdfree.wordpress.com/266

เนื่องจากพบว่ามีการปล่อยเสถียรเพียงข้อผิดพลาดเดียวที่เกี่ยวข้องกับการเปลี่ยนแปลงเคอร์เนลจาก 4.20 -> 5.0 ปัญหาอื่น ๆ ที่รายงานทั้งหมดเกี่ยวกับผู้ที่เรียนรู้สิ่งใหม่ หากการจัดการบริการต้องง่ายกว่านี้ควรเปลี่ยนมาใช้ ms-windows (Linus ห้าม) หากต้องการดูในชีวิตจริงว่าสิ่งนี้สามารถทำงานได้เพียงดาวน์โหลด Obarun live.iso และเล่นกับมัน ติดตั้งบริการและ 66 สคริปต์ของพวกเขาเปิดใช้งานฆ่าพวกเขาดูบันทึกของพวกเขาหยุดพวกเขาและเริ่มพวกเขา (ในขณะที่เปิดใช้งาน) บริการมัดไว้ในต้นไม้และมีต้นไม้แห่งการบริการที่เริ่มต้นและหยุดทั้งหมดเข้าด้วยกัน จากระบบ มันทำในสิ่งที่ s6 ทำได้ดีและทำให้ผู้ใช้สามารถใช้ประโยชน์จากระบบกันกระสุนภายใต้ s6 ได้ง่ายขึ้น

ดาวน์โหลดรูปภาพได้ที่นี่: https://web.obarun.org/index.php?id=74 md5 ตรวจสอบไฟล์https://repo.obarun.org/iso/

นอกเหนือจากการเริ่มต้นและการจัดการบริการ s6 / 66 ไม่มีการพึ่งพาใด ๆ จากสิ่งอื่นในระบบ มันเป็นเลเยอร์ของระบบพื้นฐานที่ปล่อยให้ส่วนที่เหลือของซอฟต์แวร์ทำงานด้วยตนเอง init / svc-mgmt blind s6 และ 66 ทั้งหมดเขียนด้วย C และไม่ใช่ลินุกซ์โดยเฉพาะหรือเจาะจง glibc เซิร์ฟเวอร์ (ผู้เขียน s6) ของ Skarnet ทำงานมาเกือบสิบปีแล้วโดยที่ไม่มีการหยุดชั่วคราวในระบบที่สร้างขึ้นเอง ปัจจุบัน Alpine, Void และ Adelie ยังมีซอฟต์แวร์ s6 บนที่เก็บของพวกเขา Adelie ใช้มันเพื่อดูแลการบริการตามค่าเริ่มต้น ตอนนี้โมฆะก็ถือ 66 เช่นกัน ฉันไม่ทราบว่าและสิ่งที่ขยายใครมีพอร์ตใน s6 ไปยัง xxBSD หรือระบบ xxIX อื่น ๆ

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