ส่งคำสั่งหลายคำเพื่อรวม


12
flock -x -w 5 ~/counter.txt 'COUNTER=$(cat ~/counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

ฉันจะส่งคำสั่งหลายคำสั่งให้flockเหมือนในตัวอย่างด้านบนได้อย่างไร

เท่าที่ฉันเข้าใจflockใช้แฟล็กที่แตกต่างกัน (-x สำหรับเอกสิทธิ์, -w สำหรับการหมดเวลา) จากนั้นไฟล์ที่จะล็อกและจากนั้นคำสั่งให้เรียกใช้ ฉันไม่แน่ใจว่าฉันจะส่งคำสั่งสองคำไปยังฟังก์ชันนี้ได้อย่างไร (ตั้งค่าตัวแปรด้วยเนื้อหาของไฟล์ที่ล็อคแล้วเพิ่มไฟล์นี้)

เป้าหมายของฉันที่นี่คือการสร้างส่วนเพิ่มขึ้นเล็กน้อยสำหรับไฟล์โดยการล็อคทุกครั้งที่สคริปต์พยายามเข้าถึงcounter.txtไฟล์

คำตอบ:


8

เรียกใช้เชลล์อย่างชัดเจน

flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

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

new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')

ยอดเยี่ยมขอบคุณมาก! คำอธิบายที่คุณให้ไว้ช่วยฉันอย่างแน่นอนจากอาการปวดหัวอีกชั่วโมง
d -_- b

4

หรือคุณสามารถแห่ตัวอธิบายไฟล์

exec {counterfd}<~/counter.txt
flock -x -w 5 "$counterfd"
COUNTER=$(cat ~/counter.txt)
COUNTER=$(( COUNTER +1 ))
echo "$COUNTER" >~/counter.txt
exec {counterfd}<&-

สิ่งนี้ยังมีประโยชน์ในการอนุญาตให้คุณใช้ตัวแปรตัวนับโดยตรงซึ่งแตกต่างจากวิธีการที่ใช้ subshell


โปรดที่คุณจะอธิบายexec {counterfd}? ด้วยข้อผิดพลาด Debian ของตัวเองnot foundแต่มันกลับ 0 ด้วยการเปลี่ยนเส้นทาง แปลกมาก.
Steve Almond

2

flockเครื่องมือเป็นเพียงเล็กน้อยที่ยุ่งยากในการใช้งานและหน้าคนสวยสั้น man page จัดเตรียมวิธีใช้เครื่องมือสามวิธี:

  • flock [options] <file|directory> <command> [command args]
  • flock [options] <file|directory> -c <command>
  • flock [options] <file descriptor number>

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

#!/bin/bash
(
 flock -n 9 || exit 1
 echo "commands executed under lock..."
 echo "go here..."
) 9>/tmp/mylockfile

#!/bin/bashฉันเพิ่ม

ฉันใช้รูปแบบนี้ของflockเรียบร้อยแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.