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

รายการพร็อพเพอร์ตี้ที่ถูกต้องไม่ใช่บริการที่ใช้งานได้

plutil -lint ตรวจสอบโครงสร้าง มันบอกไม่ได้ว่าไบนารีมีอยู่หรือไม่ อาร์กิวเมนต์รองรับโดยไคลเอนต์เวอร์ชันนี้หรือไม่ หรืองานเริ่มในบริบทที่มีข้อมูลรับรองหรือไม่ สิ่งเหล่านี้เป็นคำถามเชิงความหมาย และอธิบายความล้มเหลวส่วนใหญ่ที่ดูเหมือนปัญหา launchd

plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn

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

เอเจนต์สืบทอดเซสชันผู้ใช้ ส่วนดีมอนไม่

เอกสาร launchd ของ Apple แยกเอเจนต์ต่อผู้ใช้ออกจากดีมอนระบบ เอเจนต์ทำงานในบริบทของผู้ใช้ที่ล็อกอิน พร้อมพวงกุญแจและสภาพแวดล้อมของผู้ใช้คนนั้น ดีมอนทำงานโดยไม่มีเซสชันนั้น และการย้ายงานไปยังไดเรกทอรีระบบไม่ได้สร้างข้อมูลรับรองแบบโต้ตอบของผู้ใช้ขึ้นใหม่

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

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

การดูแลทำงานได้ก็ต่อเมื่อโปรเซสอยู่เบื้องหน้า

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

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

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

ข้อมูลรับรองต้องทำงานโดยไม่มีพรอมป์

การทำงานแบบไม่มีคนดูแลย้ายปัญหาข้อมูลรับรองแทนที่จะกำจัดมัน มีคนต้องเป็นเจ้าของตัวตน ตัดสินใจว่ามันมีอายุเท่าไร และบันทึกวิธีแทนที่ ใบรับรองที่ไม่มีการตรวจสอบวันหมดอายุจะกลายเป็นการหยุดให้บริการที่มีวันที่ในปฏิทิน

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

นิยามว่าพร้อมหมายถึงอะไร แล้วทดสอบตรงนั้น

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

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

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

บทความที่เกี่ยวข้อง