ใครสามารถอธิบายวิธีใช้ฝูงและอธิบายไฟล์เพื่อล็อคไฟล์และเขียนไปยังไฟล์ที่ถูกล็อค?


14

เปลือยกับฉันเมื่อฉันยังใหม่กับflockเครื่องมือและฉันไม่ได้ใช้ตัวอธิบายไฟล์เท่าที่ฉันรู้

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

นี่คือรหัสที่ฉันคาดว่าจะล็อคไฟล์ดำเนินการตามคำขอและเขียนไปยังไฟล์ข้อความ:

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

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

หากใครบางคนสามารถอธิบายวิธีการทำงานของไฟล์ descriptors เหล่านี้และแจ้งให้เราทราบว่าฉันกำลังล็อคไฟล์อย่างถูกต้องหรือไม่!

คำตอบ:


8

สิ่งนี้ไม่ถูกต้องเพราะเมื่อคุณทำ( flock -e 200; ... ) 200> fileคุณกำลังตัดทอนไฟล์file ก่อนที่คุณจะได้ล็อคแบบเอกสิทธิ์ ฉันคิดว่าคุณควรทำ:

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

เพื่อวางล็อคไฟล์ที่เปิดเป็นแบบอ่านอย่างเดียว

บันทึก. เชลล์บางตัวไม่สนับสนุน file descriptor ที่ใหญ่กว่า 9 นอกจากนี้ hardcoded file descriptor อาจถูกใช้แล้ว ด้วยเชลล์ขั้นสูง (bash, ksh93, zsh) สามารถทำสิ่งต่อไปนี้ได้:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)

ฉันต้องการคำสั่ง curl จะเขียนไปยังไฟล์ว่า ฉันเข้าใจผิดว่าflockทำงานยังไง? ฉันยังใหม่กับตัวอธิบายไฟล์: /
DuckPuncher

1
@DuckPuncher กลไกการล็อคนั้นแยกจากการอ่าน / เขียนที่คุณสามารถทำได้บนไฟล์ ดังนั้นcurlยังสามารถเขียนไปยังไฟล์ โปรดทราบว่านี่อาจไม่ปลอดภัย (หรืออาจไม่ทำงาน) กับ NFS แต่อย่าใช้เชลล์สคริปต์สำหรับการล็อกไฟล์ผ่าน NFS ด้วยbashคุณยังสามารถเปิดไฟล์สำหรับทั้งการอ่านและการเขียน200<> resp.txtแต่สิ่งนี้ไม่ควรเปลี่ยนแปลงอะไร
vinc17
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.