อ่านจากไปป์เขียนลงไฟล์
หากคุณต้องการให้ daemon อ่านอินพุตที่สร้างขึ้นโดยกระบวนการบางอย่างคุณต้องเชื่อมต่อกระบวนการนั้นกับไพพ์ ที่นี่กระบวนการโดยพลการคือคุณสะท้อนคำสั่งและมันจะทำงานในบริบทอื่น ดังนั้นสร้างท่อที่มีชื่อ (มักเรียกว่าฟีฟ่าในบริบทยูนิกซ์)
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
และเพียงแค่เขียนคำสั่งไปยังไพพ์:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
สิ่งนี้ไม่น่าจะทำงานได้อย่างที่เป็นอยู่: มีโอกาสที่ดีมอนที่จะออกเมื่อเห็นจุดสิ้นสุดของไฟล์ในอินพุตมาตรฐานซึ่งจะเกิดขึ้นทันทีที่กระบวนการแรกที่เขียนไปยังไพพ์สิ้นสุดลง คุณสามารถใช้tail -f
เพื่อหลีกเลี่ยงปัญหานั้น
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
ด้วยtail
การใช้งานบางอย่างคุณอาจถูกกัดโดยการบัฟเฟอร์: tail
กระบวนการจะรอจนกว่าจะมีจำนวนไบต์เพียงพอที่จะส่งออกบางส่วน ฉันไม่คิดว่านี่จะแก้ปัญหาได้ในกล่องเครื่องมือ POSIX; หากเป็นปัญหาให้ใช้โปรแกรม C หรือ Perl หรือ Python เล็กน้อย เท่าที่ฉันสามารถบอกได้tail
จาก GNU coreutils (เท่าที่พบใน Linux และที่อื่น ๆ ) มีความปลอดภัยในเรื่องนี้
เมื่อคุณหยุดภูตecho >/var/run/daemon.fifo
จะฆ่าtail
กระบวนการ
เริ่มโปรแกรมภายในหน้าจอ
แทนที่จะเรียกใช้ daemon โดยตรงจากตัวจัดการบริการของคุณ (คุณใช้ SysV init จริง ๆ หรือมีอะไรเพิ่มเติมเช่นสคริปต์ wrapper หรือ Upstart?) เรียกใช้
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
เนื่องจาก daemon จะไม่ใช่กระบวนการย่อยของตัวจัดการบริการคุณต้องแน่ใจว่าได้ส่งสัญญาณไปยังกระบวนการที่ถูกต้อง วิธีการทำนั้นขึ้นอยู่กับว่า daemon เริ่มต้นอย่างไรและอย่างไร
เป็นไปได้ในทางเทคนิคที่จะแนบกระบวนการทำงานกับเทอร์มินัล แต่มีความเสี่ยงที่คุณจะผิดพลาดของโปรแกรมดังนั้นนี่จึงเป็นระบบการผลิตที่แน่นอน
-L
ตัวเลือกที่จะทำให้หน้าจอเขียนทุกอย่างที่ปรากฏในหน้าต่างไปยังแฟ้ม ชื่อไฟล์ที่จะได้รับในdaemon.screenrc
กับlogfile
คำสั่ง