วิธีการรีสตาร์ทบริการโดยอัตโนมัติเมื่อล้มเหลวใน Linux


23

บน Windows คุณสามารถกำหนดสิ่งที่ควรเกิดขึ้นหาก / เมื่อบริการล้มเหลว มีวิธีมาตรฐานในการบรรลุสิ่งเดียวกันบน Linux (โดยเฉพาะอย่างยิ่ง CentOS)?

ส่วนใหญ่ของคำถามของฉันคือคุณจะจัดการกับซ็อกเก็ตที่เปิดทิ้งไว้ได้อย่างไรตัวอย่างเช่นใน TIME_WAIT, FIN_WAIT1 และอื่น ๆ

ในขณะนี้หากบริการที่ฉันกำลังเกิดปัญหาฉันต้องรอซ็อกเก็ตเพื่อล้างหรือเปลี่ยนพอร์ตฟังก่อนที่ฉันจะสามารถรีสตาร์ทด้วยตนเอง

ขอบคุณสำหรับความช่วยเหลือของคุณ.

คำตอบ:


26

monitเป็นวิธีที่ดีในการตรวจสอบและรีสตาร์ทบริการเมื่อล้มเหลว - และคุณอาจใช้บริการนี้กับบริการที่จำเป็นอื่น ๆ (เช่น Apache) มีบทความดี ๆ เกี่ยวกับ nixCraft ที่มีรายละเอียดวิธีใช้สิ่งนี้สำหรับบริการโดยเฉพาะแม้ว่าmonitตัวมันเองจะมีฟังก์ชั่นอื่น ๆ อีกมากมายนอกเหนือจากนี้

สำหรับด้านซ็อกเก็ต @galraen ตอบจุดนี้ไว้


มันเป็นความอัปยศที่ฉันต้องตัดสินใจซึ่งเป็นคำตอบ ฉันควรถามคำถามสองคำถามแยกกัน @gelraen คำตอบของคุณเพิ่งจะสิ้นสุดสัปดาห์ของการค้นหาวิธีแก้ปัญหา ขอบคุณดังนั้นมาก! @ Redmumba ขอบคุณ Monit ดูดี!
Pryo

ไม่ว่าอย่างใดอย่างหนึ่งที่คุณตัดสินใจที่จะทำเครื่องหมายถูกต้องupvote @ gelraen คำตอบของแน่นอน จุดที่ถูกต้องและให้ข้อมูลมาก
แอนดรูว์เอ็ม.

19

ตอบเฉพาะส่วนบริการรีสตาร์ทเท่านั้น ฉันเจอ Monit ด้วยเช่นกัน แต่ใน CentOS 7 systemd ดูแลทุกอย่างให้คุณ คุณเพียงแค่ต้องเพิ่มสองบรรทัดเหล่านี้ไปยังไฟล์. service (หากยังไม่ได้มี):

Restart=always
RestartSec=3

ดูhttps://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/สำหรับการอ้างอิง

หากคุณต้องการสร้างบริการ systemd ที่กำหนดเองมันค่อนข้างตรงไปตรงมาในการเขียนไฟล์บริการของคุณเอง ดูตัวอย่างด้านล่างสำหรับเซิร์ฟเวอร์ http ที่กำหนดเอง

เริ่มแก้ไขด้วยไฟล์บริการใหม่:

vim /etc/systemd/system/httpd.service

และเพิ่มเนื้อหาต่อไปนี้ซึ่งคุณสามารถแก้ไขได้ตามต้องการ:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

ฉันต้องการให้มันเริ่มโดยอัตโนมัติเมื่อบู๊ต:

systemctl enable httpd

บอก systemd เกี่ยวกับการเปลี่ยนแปลงและเริ่มบริการ:

systemctl daemon-reload
systemctl start httpd

และตอนนี้คุณสามารถดูสถานะ:

systemctl status httpd

สำหรับการอ้างอิงดูhttps://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/


ใช่systemdผู้จัดการบริการมาตรฐานในการกระจายที่เป็นที่นิยมมากที่สุดสามารถทำเพื่อคุณ
Rolf

13

คุณสามารถโทรsetsockopt(2)หาซ็อกเก็ตการฟังด้วยSO_REUSEADDRดังนั้นคุณจะสามารถbind(2)อีกครั้งโดยไม่ต้องรอการเชื่อมต่อทั้งหมด ความเป็นไปได้อีกอย่างหนึ่ง: ปล่อยการเชื่อมต่อจากเคอร์เนล FreeBSD มีtcpdropคำสั่งสำหรับสิ่งนี้ไม่รู้เกี่ยวกับ Linux


4

หาก linux distro ของคุณใช้พุ่งพรวดแทนที่จะเป็น SysV init respawnคำหลักก็จะทำเช่นนี้

http://upstart.ubuntu.com/cookbook/#respawn


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