flock
เป็นหนึ่งในวิธีการประสานการทำงาน ยูทิลิตี้นี้เป็นส่วนหนึ่งของชุดเครื่องมือ util-linux และพร้อมใช้งานสำหรับ Linux เท่านั้น ยูทิลิตี้อื่น ๆ ที่มีอยู่ในแพลตฟอร์มที่กว้างขึ้นนั้นมีพื้นฐานsetlock
มาจากสาธารณูปโภคของ Daniel J. Bernstein จากแพ็คเกจ daemontools ของเขา:
เครื่องมือเหล่านี้ทำงานด้วยกระบวนทัศน์ที่แตกต่างกันเล็กน้อยกับที่ใช้ในคำตอบของ M. Kurenkov (เครื่องมือหนึ่งที่flock
สามารถใช้งานได้ แต่ไม่ได้อยู่ในคำตอบนั้น) หนึ่งเรียกใช้setlock
โปรแกรมเพื่อโยงโหลดไปยังคำสั่งที่ต้องถูกเชื่อมโยงกัน setlock
ตัวเองเปิดและล็อคไฟล์ล็อคและปล่อยให้ไฟล์อธิบายมันเปิดในกระบวนการของมัน การล็อกยังคงอยู่ตราบใดที่กระบวนการนั้นทำ (ยกเว้นว่าคำสั่งที่ตามมาถูกโยงโซ่เพื่อปลดล็อกอย่างชัดเจนโดยการค้นหาและปิดตัวอธิบายไฟล์ที่เปิด)
สำหรับกรณีในคำถามเราต้องเชื่อมคำสั่งที่ก่อให้เกิดบรรทัดเอาต์พุตโดยระวังว่าสิ่งนี้เรียกใช้งานภายนอก echo
แทนecho
คำสั่งในตัวของเชลล์:
setlock mylockfile echo "$ RESULT" >> ./$TEMP_DIR/$OUT_FILE
ในกรณีนี้มันไม่จำเป็นต้องเชื่อมต่อกันเปิดไฟล์ที่ส่งออกในโหมดผนวก ถ้าเป็นเช่นนั้นเราจะต้องเปิดไฟล์นั้นภายในล็อคซึ่งจำเป็นต้องใช้โปรแกรมเช่นfdredir
/ redirfd
:
setlock mylockfile fdredir - ผนวก 1 "./$TEMP_DIR/$OUT_FILE" echo "$ RESULT"
อันไหนที่สามารถเปลี่ยนเป็นฟังก์ชันเชลล์ได้หากต้องการ:
outfile () {setlock mylockfile fdredir - ผนวก 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; }
[…]
outfile echo "$ RESULT"
หรือผสานกับไวยากรณ์เชลล์และตีความโดยเชลล์ที่สองที่ทำงานภายใต้ลูกโซ่ซึ่งต้องการการอ้างอิงที่ไม่สำคัญถ้าตัวแปรเชลล์ตัวใดตัวหนึ่งไม่ถูกส่งออกเป็นตัวแปรสภาพแวดล้อม:
setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'" '
หลักสูตรนี้พูดคุยกับสิ่งอื่นที่ไม่ใช่การเขียนไปยังไฟล์เอาต์พุต:
setlock mylockfile sh -c '…เชื่อมต่อกัน; สิ่งที่ ... '
`pwd`
; คุณสามารถใช้จุด (.
) นอกจากนี้คุณควรจะพูดชื่อแฟ้มที่ทั้งเพราะมันมีตัวแปร