ฉันไม่ได้รับmkfifoเคล็ดลับในการทำงานอย่างน่าพอใจ; ดูเหมือนจะไม่จับ stderr และพยายามเปลี่ยนเส้นทางทำให้พุ่งพรวดโดยไม่มีข้อผิดพลาด
นอกจากนี้ยังมีผลข้างเคียงที่โชคร้ายในการทำให้loggerกระบวนการแฮงค์เป็นเด็กinitดังนั้นข้อมูลเกี่ยวกับผู้ที่ "เจ้าของ" คนตัดไม้หายไปและทุกคนที่ไม่ได้ตระหนักถึงความmkfifoสามารถในการคิดว่ามันเป็นกระบวนการห้อยที่สามารถฆ่าได้
แต่ฉันลงเอยด้วยวิธีแก้ปัญหาต่อไปนี้ซึ่งแก้ไขปัญหาเหล่านี้ทั้งหมด มันทำให้logger กลายเป็นกระบวนการเด็กในขณะที่รักษาบริการเป็นกระบวนการราก น่าเสียดายที่มันต้องมีการเรียกใช้bashแต่มันก็ดูสกปรก
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
สิ่งนี้ใช้เคล็ดลับที่เปลี่ยนเส้นทาง stdout และ stderr ไปยังคำสั่ง เนื่องจากเราดำเนินการบริการภายในbashคำสั่งนี้มีผลข้างเคียงของการแทนที่เชลล์และการทุบตีอย่างน่าอัศจรรย์กลายเป็นกระบวนการลูกของบริการดังที่แสดงโดยps aufxw:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
bash -cด้วยเหตุผลบางคำสั่งดังกล่าวจะต้องมีการห่อใน ฉันถือว่านี่เป็นเพราะพุ่งพรวดเพียงแกล้งทำสคริปต์ของคุณผ่าน Bash แต่ไม่จริง หากใครสามารถแนะนำวิธีหลีกเลี่ยงเปลือก bash พิเศษนั่นจะยอดเยี่ยม