เป็นไปได้ไหมที่จะทำการค้นหา () กับการส่งคืนไพพ์ที่มีชื่อสำเร็จ


12

มีวิธีใดบ้างที่จะทำให้โปรแกรมพยายามดำเนินseek()การกับไพพ์ที่มีชื่อมันจะกลับมาประสบความสำเร็จ (แต่ทำราวกับว่าไพพ์เป็นไฟล์เปล่า) แทนที่จะเป็น 'Illegal แสวงหา'?

ฉันมีการบันทึกในระบบของฉันเล็กน้อยทุกครั้งที่เก็บไว้ในฐานข้อมูล SQLite ฉันไม่มีไฟล์ทุกที่ อย่างไรก็ตามมีบางโปรแกรมที่มีปัญหากับสิ่งนี้ มี 2 ​​กรณีที่เฉพาะเจาะจง;

  • โปรแกรมต้องการเขียนไปยังล็อกไฟล์ซึ่ง syslog-ng ได้สร้างขึ้นเป็นไพพ์ที่มีชื่อและกำลังอ่านจาก โปรแกรมต้องการดำเนินการseek()ด้วยเหตุผลบางอย่างแล้วล้มเหลว
  • โปรแกรม (เช่น denyhosts หรือ fail2ban) ต้องการอ่านจากไฟล์บันทึกที่ syslog-ng สร้างขึ้นเป็นไพพ์ที่มีชื่อและกำลังเขียนถึง โปรแกรมต้องการดำเนินการseek()กับมันและล้มเหลว

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

ดังนั้นมีตัวเลือกที่สามารถตั้งค่าบน pipes ชื่อเพื่อให้พวกเขาทำงานแบบนี้? หากไม่มีโหมดที่สามารถตั้งค่าได้เมื่อ syslog-ng เปิดไปป์เพื่อให้มันทำงานแบบนี้ (ฉันเปิดเพื่อทำการเปลี่ยนแปลงรหัส)? หรือว่าฉันเป็นห้วย

คำตอบ:


10

มีการเสนอท่อ Seekable สำหรับเคอร์เนล Linux แต่ฉันไม่ทราบว่าแพทช์การทำงานจะใช้งานได้หรือไม่

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


1
ฉันจะลองใช้เส้นทาง LD_PRELOAD ไม่ใช่ทางออกที่ดีที่สุด แต่ควรทำได้
Patrick

Btw จะต้องมีท่อที่สามารถค้นหาได้น้อยกว่าเพื่อให้สามารถติดตามท่อได้ในลักษณะเดียวกับที่สามารถติดตามไฟล์ได้ ฉันถามในบริบทของการติดตามท่อโดยใช้น้อยลงหรือไม่ คำถาม (คุณอาจต้องการตอบคำถามนั้น)
Piotr Dobrogost

@PiotrDobrogost ในบริบทของFคำสั่งน้อยมันจะเพียงพอสำหรับการรีเฟรชหน้าจอถ้ามันไม่ได้รับผลลัพธ์ใด ๆ ในวินาทีหรือมากกว่านั้น การทำให้ค้นหาท่อไม่สามารถช่วยได้: ความแตกต่างที่เกี่ยวข้องนั่นคือFไปที่จุดสิ้นสุดของไฟล์จากนั้นรอให้ข้อมูลปรากฏผ่านจุดสิ้นสุด - แต่สำหรับไปป์จุดสิ้นสุดของไฟล์จะเกิดขึ้นเมื่อผู้เขียนปิดไฟล์เท่านั้น
Gilles 'หยุดชั่วร้าย'

1

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

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


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

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

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

1
@ แพทริกสำหรับอดีตถ้ามันผนวกมันควรจะเปิดไฟล์ในโหมดผนวก ในกรณีนี้คุณกำลังพูดถึงการอ่านซึ่งในกรณีนี้มันไม่เหมาะสมที่จะข้ามข้อมูลใหม่ที่ยังไม่ได้อ่าน สำหรับหลังหากพยายามใช้ find เพื่อกลับไปที่ตำแหน่งเดิมหลังจากปิดและเปิดไฟล์ที่จะแตกไปป์ถ้าคุณไม่สนใจการค้นหาเนื่องจากเมื่อมันปิดไปป์เซิร์ฟเวอร์จะได้รับ SIGPIPE ซึ่ง สันนิษฐานว่าทำให้มันรีเซ็ตดังนั้นลูกค้ารายต่อไปที่เปิดไปป์เริ่มต้นที่จุดเริ่มต้น
psusi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.