systemd สามารถตรวจจับและฆ่าโพรเซสที่หยุดทำงานได้หรือไม่?


15

ในขณะที่ทำงานกับโซลูชันที่ใช้การล็อกไฟล์ฉันเชื่อว่ารหัสของฉันกำลังจะหยุดชะงัก ฉันใช้ systemd เพื่อเริ่มกระบวนการในการเริ่มต้นระบบ การใช้ alarm (3) เป็นตัวเลือก แต่ฉันสงสัยว่ามีวิธีให้ systemd ตรวจจับกระบวนการที่หยุดทำงานและเริ่มต้นใหม่หรือไม่

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

เพียงแค่สงสัยว่ามีวิธีที่ดีกว่าในการตรวจสอบกระบวนการผ่าน systemd หรืออย่างอื่น


อาจจะไม่. คุณจะบอกได้อย่างไรว่ากระบวนการหยุดทำงานหรือไม่ เกิดอะไรขึ้นถ้าคุณจริงๆต้องสิ่งที่ชอบfor(;;) do_something();?
mvp

4
พูดอย่างเคร่งครัดหากรหัสของคุณแฮงค์คุณควรแก้ไขข้อบกพร่องของปัญหานั้น การฆ่ามันผ่าน systemd (สมมติว่าสามารถทำได้ซึ่งฉันไม่เชื่อ) หรือด้วยวิธีอื่นใดเป็นสิ่งที่เหมาะสมที่จะต้องทำเมื่อคุณทำการดีบั๊ก แต่คุณไม่สามารถปล่อยให้มันเป็นอิสระในการหยุดชะงักได้
MariusMatutiae

คำตอบ:


24

ใช่; แต่ก่อนแก้ไขโปรแกรมรถของคุณก่อนที่จะเล่นซอกับ systemd

MariusMatutiae ค่อนข้างถูกต้อง คุณมีปัญหากับโปรแกรมของคุณ มันหยุดชะงัก การเล่นซอกับ systemd ไม่ใช่คำตอบ ที่ดีที่สุดมันเป็นสิ่งที่ทำให้ไขว้เขว แก้ไขโปรแกรมของคุณเพื่อไม่ให้เสีย กำกับพลังงานของคุณในสิ่งที่ถูกต้อง

ที่กล่าวว่าคนอื่นจะมาที่นี่เพราะชื่อคำถามมากกว่าคำถามที่เหมาะสม เพื่อประโยชน์ของพวกเขานี่คือคำตอบของชื่อโดยไม่สนใจคำถาม:

ใช่ systemd สามารถตรวจสอบdæmonsและรีสตาร์ทโดยอัตโนมัติหากพวกเขาหยุดพูด ไม่ใช่แค่dæmonsรุ่นเก่า ๆ เท่านั้น ในฐานะที่เป็น mvp บันทึกว่าไม่มีทางที่จะรู้ว่ามีdæmonแขวนอยู่ (ในจักรวาลนี้ซึ่งปัญหาการลังเลไม่สามารถตัดสินใจได้อย่างน้อย) ทั้ง systemd หรือโปรแกรมคอมพิวเตอร์อื่น ๆ จะไม่สามารถหักลบได้ตั้งแต่เริ่มต้นว่าโปรแกรมแบบสุ่มบางอันที่ถูกโยนลงไปนั้นถูกหยุดชะงักหรือเข้าสู่วงวนไม่สิ้นสุดหรืออะไรก็ตาม สิ่งที่ดีที่สุดที่คุณจะได้รับจากที่นี่คือการตรวจจับว่าdæmonไม่ได้ดำเนินการ "heartbeat" ตามปกติภายในระยะเวลาที่กำหนด

ดังนั้นผู้ใช้ที่ใช้ประโยชน์จากความสามารถในการจ้องจับผิดของ systemd จึงต้องถูกเขียนขึ้นเพื่อพูดโปรโตคอลที่เฉพาะเจาะจงของ systemd นั่นคือโปรโตคอล sd_notify สิ่งนี้จะทำให้รหัสdæmonยุ่งยากน้อยลง มีความซับซ้อนมากขึ้นเนื่องจากdæmonsควรเขียนอย่างถูกต้องตรวจสอบว่าพวกเขาได้รับการเปิดใช้งานด้วยการเปิดใช้งานฟังก์ชั่นการเฝ้าระวังเช่นกัน

dæmonที่พูดโปรโตคอลนี้เพื่อใช้ประโยชน์จากความสามารถในการเฝ้าระวังของ systemd ...

  • ... ต้องตรวจสอบWATCHDOG_USECตัวแปรสภาพแวดล้อม
  • ... ต้องเรียกsd_notify ()อย่างต่อเนื่องและบ่อยครั้งตลอดอายุการใช้งานพร้อมWATCHDOG=1ชุดตัวเลือกในช่วงเวลาประมาณWATCHDOG_USEC/ 2 ("USEC" หมายถึงไมโครวินาที)
  • ... ต้องมีการType=notifyตั้งค่าในไฟล์หน่วย
  • ... ควรมีNotifyAccess=main(หรือ=all) ตั้งในไฟล์หน่วย
  • ... ต้องมีการตั้งค่าWatchdogSec=วินาทีในไฟล์หน่วย
  • ... ต้องเชื่อมโยงกับ libsystemd-daemon.so

หากคุณต้องการทราบรายละเอียดของการเข้ารหัสนี้หลังจากอ่านคู่มือแล้วตรวจสอบให้แน่ใจว่าคุณไปที่ StackExchange ที่ถูกต้อง นี่คือ SuperUser StackOverflow อยู่ตรงนั้น

อ่านเพิ่มเติม

  • Lennart Poettering 2011/04/12 ลูกน้อง Freedesktop.org

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