การเปิดไฟล์ไม่ใช่การล็อคเพราะหากแต่ละกระบวนการต้องตรวจสอบว่าไฟล์เปิดก่อนหรือไม่และดำเนินการต่อว่าเป็นหรือสร้าง / เปิดหากไม่มีหรือไม่กระบวนการทั้งสองสามารถตรวจสอบได้พร้อมกันทั้งคู่ ไม่ได้เปิดจากนั้นทั้งสร้างหรือเปิด
หากต้องการใช้ไฟล์เป็นล็อคการดำเนินการตรวจสอบและล็อคจะต้องมีการดำเนินการแบบต่อเนื่องเดียว คุณสามารถทำสิ่งนี้ได้ในระบบไฟล์ Unix โดยการสร้างไฟล์ด้วยโหมดอ่านอย่างเดียวและลบออกเพื่อปลดล็อก หากไฟล์มีอยู่ (และอ่านอย่างเดียว) การสร้างไฟล์จะล้มเหลวดังนั้นคุณจะได้รับการตรวจสอบและล็อคในการทำงานแบบปรมาณูเดียว
หากกระบวนการล็อคของคุณเป็นเชลล์สคริปต์ที่จะทำงานเป็น daemon คุณสามารถได้รับผลกระทบนี้โดยใช้umask
การตั้งค่าต่อกระบวนการที่กำหนดสิทธิ์ที่สร้างไฟล์ใหม่ด้วย:
oldumask = $ (umask)
umask 222 # สร้างไฟล์ที่ไม่สามารถเขียนให้เจ้าของได้เช่นกัน
ถ้า echo $$> / var / lock / foo
แล้วก็
: การล็อคสำเร็จ
อื่น
: การล็อคล้มเหลว
Fi
ขอ $ oldumask
นอกจากนี้ยังเขียน PID ของกระบวนการที่เป็นเจ้าของลงในไฟล์ซึ่งแก้ไขปัญหาอื่นของคุณ:
cat /var/lock/foo
สำหรับคำถามเฉพาะ "กระบวนการใดที่ไฟล์นี้เปิดอยู่" นี่เป็นประโยชน์เมื่อคุณต้องการยกเลิกการต่อเชื่อมระบบไฟล์ แต่ไม่สามารถทำได้เนื่องจากบางกระบวนการมีไฟล์เปิดอยู่ หากคุณไม่มีคำสั่งเหล่านั้นคุณสามารถถาม
/proc
ในฐานะรูท:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
หรือในฐานะผู้ใช้ที่เป็นมนุษย์:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'