โปรโตคอลความพร้อมไม่ตรงกัน
ตามที่ Wieland บอกไว้Type
การบริการมีความสำคัญ การตั้งค่านั้นหมายถึงสิ่งที่ความพร้อมของโปรโตคอล systemd ต้องการให้บริการพูด simple
บริการจะถือว่ามีความพร้อมทันที forking
บริการจะนำไปเป็นพร้อมหลังจากขั้นตอนการเริ่มต้นของส้อมเด็กและออกแล้ว dbus
บริการจะนำไปเป็นพร้อมเมื่อเซิร์ฟเวอร์จะปรากฏขึ้นบนรถประจำทางสก์ท็อป และอื่น ๆ
หากคุณไม่ได้รับโพรโทคอลเตรียมพร้อมในการประกาศในหน่วยบริการให้ตรงกับสิ่งที่บริการทำ โปรโตคอลความพร้อมไม่ตรงกันทำให้บริการไม่สามารถเริ่มทำงานได้อย่างถูกต้องหรือ (โดยปกติ) จะถูกวินิจฉัยโดย systemd ว่าผิดพลาด เมื่อบริการถูกมองว่าล้มเหลวในการเริ่มต้น systemd ทำให้มั่นใจได้ว่าทุกกระบวนการกำพร้าเพิ่มเติมของบริการที่อาจถูกปล่อยให้ทำงานอยู่เป็นส่วนหนึ่งของความล้มเหลว (จากมุมมองของมัน) ถูกฆ่าเพื่อนำบริการกลับมาอย่างไม่เหมาะสม สถานะ.
คุณทำสิ่งนี้
แรกของทุกสิ่งที่ง่าย: sh -c
ไม่ตรงหรือ Type=simple
Type=forking
ในsimple
โปรโตคอลกระบวนการเริ่มต้นจะถูกนำไปใช้เป็นกระบวนการบริการ แต่ในความเป็นจริงsh -c
เสื้อคลุมรันโปรแกรมบริการที่เกิดขึ้นจริงเป็นกระบวนการเด็ก ดังนั้นMAINPID
ไปผิดและExecReload
หยุดทำงานสำหรับการเริ่ม เมื่อใช้งานType=simple
คุณจะต้องใช้งานsh -c 'exec …'
หรือไม่ใช้งาน sh -c
ตั้งแต่แรก หลังมักจะเป็นวิธีที่ถูกต้องมากกว่าที่บางคนคิดว่า
sh -c
ไม่Type=forking
เหมือนกัน โปรโตคอลความพร้อมใช้งานสำหรับforking
บริการนั้นค่อนข้างเฉพาะ กระบวนการเริ่มต้นต้องแยกลูกแล้วออกจาก systemd ใช้การหมดเวลากับโปรโตคอลนี้ หากกระบวนการเริ่มต้นไม่แยกกันภายในเวลาที่กำหนดนั่นเป็นความล้มเหลวที่จะพร้อม หากกระบวนการเริ่มต้นไม่ออกภายในเวลาที่กำหนดนั่นก็เป็นความล้มเหลวเช่นกัน
ความสยองขวัญที่ไม่จำเป็นนั่นคือ ossec-control
ซึ่งนำเราไปสู่สิ่งที่ซับซ้อน: ossec-control
สคริปต์นั้น
ปรากฎว่าเป็นrc
สคริปต์ระบบ 5 ที่แยกกระบวนการระหว่าง 4 และ 10 ซึ่งตัวเองอยู่ในตาเทิร์นฟอร์กและออกเช่นกัน เป็นหนึ่งในrc
สคริปต์ของ System 5 ที่พยายามจัดการกระบวนการเซิร์ฟเวอร์ทั้งชุดในหนึ่งสคริปต์โดยมีfor
ลูปเงื่อนไขการแข่งขันกฎเกณฑ์sleep
เพื่อพยายามหลีกเลี่ยงโหมดความล้มเหลวที่สามารถทำให้ระบบอยู่ในสถานะเริ่มครึ่ง และความน่ากลัวอื่น ๆ ทั้งหมดที่ทำให้ผู้คนคิดค้นสิ่งต่าง ๆ เช่น AIX System Resource Controller และ daemontools เมื่อสองทศวรรษก่อน และอย่าลืมสคริปต์เชลล์ที่ซ่อนอยู่ในไดเรกทอรีไบนารีที่มันเขียนซ้ำได้ทันทีเพื่อใช้คำที่มีลักษณะเฉพาะenable
และdisable
คำกริยา
ดังนั้นเมื่อคุณ/bin/sh -c '/var/ossec/bin/ossec-control start'
เกิดอะไรขึ้นก็คือ:
- systemd ส้อมสิ่งที่คาดว่าจะเป็นกระบวนการบริการ
ossec-control
นั่นคือเปลือกซึ่งส้อม
- ในทางกลับกันส้อมระหว่าง 4 และ 10 ลูกหลาน
- หลานทุกคนแยกและออกในทางกลับกัน
- ลูกหลานที่ดีทุกคนแยกและออกจากกัน
ossec-control
ทางออก
- เชลล์แรกออก
- กระบวนการบริการเป็นดีลำดับของทวดหลาน แต่เป็นเพราะวิธีการทำงานของการแข่งขันนี้ค่า
forking
มิได้simple
โปรโตคอลพร้อม systemd พิจารณาบริการโดยรวมจะมีการล้มเหลวและปิดมันกลับลงมา
ไม่มีเรื่องสยองขวัญใด ๆ ที่เป็นสิ่งจำเป็นภายใต้ systemd เลย ไม่มีเลย
หน่วยบริการแม่แบบ systemd
แต่หนึ่งหน่วยเขียนแม่แบบที่ง่ายมาก:
[Unit]
คำอธิบาย = เซิร์ฟเวอร์ OSSEC HIDS% i
หลังจาก = network.target
[บริการ]
type = ง่าย
ExecStartPre = / usr / bin / env / var / ossec / bin /% p-% i -t
ExecStart = / usr / bin / env / var / ossec / bin /% p-% i -f
[ติดตั้ง]
WantedBy = multi-user.target
/etc/systemd/system/ossec@.service
บันทึกนี้นี้เป็น
บริการจริงต่าง ๆ เป็นอินสแตนซ์ของแม่แบบนี้ซึ่งมีชื่อว่า
ossec@dbd.service
ossec@agentlessd.service
ossec@csyslogd.service
ossec@execd.service
ossec@agentd.service
ossec@logcollector.service
ossec@syscheckd.service
ossec@maild.service
ossec@analysisd.service
ossec@remoted.service
ossec@monitord.service
จากนั้นเปิดใช้งานและปิดการใช้งานฟังก์ชั่นมาตรงจากระบบการจัดการบริการ (ด้วยRedHat bug 752774คงที่) โดยไม่จำเป็นต้องใช้เชลล์สคริปต์ที่ซ่อนอยู่
systemctl เปิดใช้งาน ossec @ dbd ossec @ agentlessd ossec @ csyslogd ossec @ maild ossec @ execd ossec @ การวิเคราะห์ ossec @ logcollector ossec @ remote ossec @ syscheckd ossec @ monitord
ยิ่งไปกว่านั้น systemd ได้รับรู้และติดตามแต่ละบริการจริงโดยตรง journalctl -u
มันสามารถกรองบันทึกของพวกเขาด้วย สามารถทราบได้เมื่อบริการส่วนบุคคลล้มเหลว มันรู้ว่าควรจะเปิดใช้งานและบริการใด
โดยวิธีการ: Type=simple
และ-f
ตัวเลือกอยู่ที่นี่เช่นเดียวกับในกรณีอื่น ๆ บริการน้อยมากในป่าจริงสัญญาณของพวกเขาพร้อมโดยอาศัยexit
และสิ่งเหล่านี้ที่นี่ไม่ได้เช่นกัน แต่นั่นคือสิ่งที่forking
ประเภทหมายถึง บริการในป่าในทางแยกและออกเพียงเพราะความผิดพลาดบางอย่างที่ได้รับความคิดภูมิปัญญาว่านั่นคือสิ่งที่dæmonsควรทำ ที่จริงแล้วมันไม่ใช่ มันไม่ได้เป็นมาตั้งแต่ปี 1990 ได้เวลาทันแล้ว
อ่านเพิ่มเติม
- Jonathan de Boyne Pollard (2015) ปัญหาโปรโตคอลการเตรียมพร้อมกับdæmonsยูนิกซ์ คำตอบที่ได้รับบ่อย