ฉันไม่ได้รับ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 พิเศษนั่นจะยอดเยี่ยม