วิธีเขียนสคริปต์หยุดที่กำหนดเอง runit


12

ฉันต้องการมีสคริปต์ "หยุด" แบบกำหนดเองrunit( runsv) เพื่อดำเนินการเมื่อต้องหยุด / เริ่มกระบวนการใหม่ ขณะนี้มันเพิ่งฆ่ากระบวนการแล้วเรียกใช้สคริปต์ "เสร็จสิ้น" แต่ในกรณีของฉันกระบวนการของฉันวางกระบวนการเด็กแบบไดนามิกดังนั้นแทนที่จะง่ายkillฉันต้อง a "killtree"เพื่อกำจัดพวกเขา ฉันจะทำอย่างไร

ฉันรู้ว่ามันควรจะทำผ่านcontrolตัวเลือกของ runit แต่จากการอ่านเอกสารมันไม่ชัดเจนสำหรับฉันว่าสคริปต์หยุดควรตั้งชื่ออย่างไร :(

http://smarden.org/runit/runsv.8.html


บริการของคุณ (ไม่ใช่สคริปต์ แต่เป็นโปรแกรม) ฟังก์ชั่นที่ไม่ถูกต้องควรได้รับการทำความสะอาดหลังจากลูกของตัวเอง แค่อยากรู้มันคืออะไร?
Avery Payne

คำตอบ:


13

จากเอกสาร

สำหรับอักขระควบคุมแต่ละตัว c ที่ส่งไปยังไพพ์คอนโทรลให้รัน v ตรวจสอบก่อนว่าเซอร์วิส / การควบคุม / c มีอยู่และสามารถเรียกใช้งานได้หรือไม่ ถ้าเป็นเช่นนั้นก็จะเริ่มบริการ / ควบคุม / c และรอให้มันยุติก่อนที่จะตีความคำสั่ง หากโปรแกรมออกจากโค้ดส่งคืน 0, runv จะยกเลิกการส่งสัญญาณที่สอดคล้องกัน คำสั่ง o ถูกพิจารณาว่าเป็นคำสั่ง u เสมอ เมื่อคำสั่ง d บริการแรก / ควบคุม / t ถูกตรวจสอบแล้วบริการ / ควบคุม / d บนคำสั่ง x บริการแรก / ควบคุม / t ถูกตรวจสอบแล้วบริการ / ควบคุม / x ไม่สามารถปรับแต่งการควบคุมบริการบันทึกเพิ่มเติมได้

นั่นหมายความว่าคุณต้องสร้างservice_name/control/X, X ซึ่งเป็นไฟล์ปฏิบัติการที่จะทำงานเมื่อคุณส่งsvคำสั่งที่เกี่ยวข้องไปยังบริการเช่นdคำสั่ง (ลง) หากสคริปต์ของคุณออกจากสถานะ 0 มันจะไม่พยายามลงบริการเอง

โดยทั่วไปคุณต้องการสคริปต์/etc/sv/<service>/control/dที่สามารถใช้งานได้ซึ่งจะทำทุกอย่างที่คุณต้องการและฆ่าบริการล้างข้อมูล pids และอื่น ๆ


มันน่าสนใจจริงๆและง่าย ๆ ในการที่ runv dir ทำงาน
Dzung Nguyen

2

คำตอบง่ายๆคือตั้งชื่อสคริปต์การล้างข้อมูล "service / finish" ของคุณ สคริปต์นี้ถูกเรียกใช้งานเมื่อออกจาก "service / run"

นอกจากนี้ยังมีอินเตอร์เฟส "service / control / ctrl_char ช่วยให้คุณสามารถดำเนินการที่แตกต่างกันขึ้นอยู่กับคำสั่งที่คุณส่งไปยัง runv


1
บริการ / เสร็จสิ้นการทำงานหลังจากระยะเวลาถูกส่งไปยังบริการที่ทำงานอยู่ มันเหมือนบริการล้างหลังจากฆ่า
MaximKostrikin

2

ฉันต้องแก้ปัญหานี้ด้วยตัวเองเพื่อเทียบท่า ฉันเปิดใช้งานเซิร์ฟเวอร์ uwsgi และมีการส่งสัญญาณผิดโดยนักเทียบท่า (TERM แทนที่จะเป็น INT) ในการหยุดการทำงานของคอนเทนเนอร์

แนวคิดของไฟล์ควบคุม / x คือการตอบสนองต่อสัญญาณที่ได้รับ ในกรณีของฉันฉันจะวางtไฟล์สำหรับสัญญาณยุติลงในการควบคุมเนื่องจากเป็นไฟล์ที่สงวนไว้สำหรับสัญญาณคำ สคริปต์ควรเรียกใช้งานได้

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

สคริปต์ส่งสัญญาณ int ไปยังกระบวนการ uwsgi ซึ่งเป็นสิ่งที่ฉันต้องการ

หากสคริปต์ควบคุมกำลังออกโดยไม่มีข้อผิดพลาด (รหัสส่งคืน 0) สัญญาณดั้งเดิมจะไม่ถูกส่งไปยังกระบวนการ

ดังนั้นในกรณีของฉันฉันสามารถรับสัญญาณคำและส่งสัญญาณ int ไปยังกระบวนการบริการแทน

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