จาก init.d ถึงพุ่งพรวดมีสะพานไหม?


11

ฉันมีสคริปต์ที่ดีอย่างสมบูรณ์แบบสำหรับใช้ใน /etc/init.d ในความเป็นจริงฉันมีพวกมันมากมายซึ่งทั้งหมดสร้างด้วย Tanuki Java Service Wrapper

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

ฉันพลาดอะไรไปรึเปล่า?

คำตอบ:


9

ฉันจำไม่ได้ว่าเห็นเทมเพลตสำหรับสิ่งนี้ อย่างไรก็ตามมันเป็นเรื่องน่าขันเล็กน้อยซึ่งในทางเทคนิคแล้วมันคือการพุ่งพรวดที่กำลังเริ่มต้นสคริปต์ init.d ของคุณในตอนแรกขอบคุณสำหรับความเข้ากันได้ย้อนหลังงาน rc และ rcS

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

description "xyz"
author "xyz"
start on runlevel 5
stop on runlevel [!5]

pre-start script
    # do my work here to start the service
end script

post-stop script
    # do work here to stop the service
end script

ตอนนี้ขึ้นอยู่กับลักษณะของบริการไม่ว่าจะยังคงมีอยู่หรือแยกตัวเองคุณอาจต้องเพิ่มexpect forkหรือtaskลงในไฟล์งาน

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

exec service_cmd

ในเอกสารธรรมดากล่าวว่าระดับการทำงาน 3,4 และ 5 ไม่ได้ใช้ ดังนั้นคุณควรใช้ระดับการรัน 2
djangofan

ไม่นานมานี้ แต่ฉันค่อนข้างแน่ใจว่า 5 เป็นระบบที่เริ่มด้วย GUI อย่างน้อยก็เคยเป็นมา
Joseph Rogers

6

ดังนั้นจุดหนึ่งของงานพุ่งพรวดคือเขียนได้ง่าย

มีเวทย์มนต์เชลล์สคริปต์จำนวนมากในสคริปต์ init.d ที่ได้รับซ้ำ ๆ ไปเรื่อย ๆ คำสั่ง Case, การติดตาม pidfile, บรรทัดข้อคิดเห็น lsb มันไม่ชัดเจนมากนักในการเขียนสคริปต์ GOOD init.d โดยไม่ต้องอ่าน

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

แต่จริงๆแล้วการพุ่งพรวดทำให้สิ่งต่าง ๆ เป็นเรื่องง่าย คุณไม่จำเป็นต้องมีการเริ่มต้นล่วงหน้าเว้นแต่คุณจะต้องตั้งค่าสิ่งต่างๆเช่น tmpdirs, ulimits หรืออาร์กิวเมนต์ runtime คุณไม่ควรต้องโพสต์สต็อปเว้นแต่ว่าคุณต้องการให้แน่ใจว่าคุณเรียบร้อยหลังจากบริการ (บริการควรจะทำความสะอาดหลังจากที่ตัวเองออกปกติ

บ่อยครั้งที่สคริปต์ init.d ขนาดยักษ์ที่มีตัวเลือกมากมายทำให้งานพุ่งพรวดเป็น 10 - 15 บรรทัด สคริปต์ init.d ที่ซับซ้อนที่สุดสามารถมีตรรกะส่วนใหญ่ทิ้งลงใน pre-start's กุญแจสำคัญคือมันเป็นเพียงตัวอย่างเล็ก ๆ ของรหัสในการตั้งค่าสภาพแวดล้อมสำหรับกระบวนการและไม่ใช่ตรรกะในการจัดการการเริ่ม / หยุด / respawn / ฯลฯ

ส่วนที่ยากที่สุดและคนที่ทำผิดบ่อยที่สุดคือการรู้ว่าจะเริ่ม / หยุดงานเมื่อใด start on runlevel [2345]ดูเหมือนว่ามีเหตุผล แต่ไม่สนใจข้อเท็จจริงที่ว่าเครือข่ายกำลังเกิดขึ้นพร้อมกัน ณ จุดนั้นเช่นเดียวกับที่ระบบไฟล์โลคัลเมาต์ กุญแจสำคัญคือการลองและคำนวณสิ่งที่คุณต้องการขั้นต่ำ (บริการอื่น ๆ ระบบแฟ้มเครือข่าย ฯลฯ ) เพื่อเริ่มใช้งานและเริ่มต้นเมื่อเสร็จสิ้น start on (local-filesystems and net-device-up IFACE!=lo)บริการส่วนใหญ่เครือข่ายแบบดั้งเดิมควรจะทำอย่างไร


3

ผมคิดว่าคงพุ่งพรวดเข้ากันได้ย้อนหลังกับสคริปต์ init SysV /etc/init.dสไตล์ คุณควรจะสามารถใช้สคริปต์เริ่มต้นของคุณไม่เปลี่ยนแปลง


มันทำ แต่คำสั่งไม่ง่ายต่อการคาดเดาอีกต่อไป งานพุ่งพรวดอาจเริ่มต้นก่อน / หลังสคริปต์ rc2.d / S99mything ของคุณกำลังทำงาน ดังนั้นทันทีที่คุณขึ้นอยู่กับบริการที่ได้รับการจัดการพุ่งพรวด
SpamapS

2
ในฐานะที่เป็นสับคุณสามารถลบสคริปต์ init ของคุณจากระดับการทำงานที่เฉพาะเจาะจงและแทนที่จะเพิ่มพวงของสายเช่น/etc/init.d/myservice startการ/etc/rc.localในลำดับที่ถูกต้อง สิ่งนี้จะช่วยให้มั่นใจได้ว่าบริการของคุณจะเริ่มต้นครั้งล่าสุดหลังจากบริการอื่น ๆ ทั้งหมดรวมถึงบริการที่เริ่มต้นโดยสคริปต์เริ่มต้นระบบพุ่งพรวด
Ryan C. Thompson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.