ท่องเครือข่ายระดับชาติฉันเจอไฟล์ บทความที่น่าสนใจ (ซึ่งฉันนำมาที่นี่ด้วยข้อความเพราะมีการอธิบายอย่างเชี่ยวชาญ) ซึ่งผู้เขียนแสดงให้เราเห็นถึงวิธีทำให้สคริปต์ทุบตีของเรามีประสิทธิภาพมากขึ้นโดยใช้ กับดัก.
ทำให้สคริปต์ทุบตีของคุณมีประสิทธิภาพมากขึ้นด้วยกับดัก
ลองนึกภาพว่าคุณมีสคริปต์ทุบตีที่ทำงานทุกวันทุกหกชั่วโมงและเมื่อถึงจุดหนึ่งมันก็ล้มเหลวหรือสคริปต์เดียวกันนั้นทำงานสองครั้งพร้อมกัน สถานการณ์ทั้งสองนี้ค่อนข้างอึดอัดเนื่องจากจำเป็นต้องมีการแทรกแซงของมนุษย์เพื่อแก้ไขหรือในบางช่วงก็ไม่สามารถแก้ไขได้ทำให้ระบบอยู่ในสถานะที่ไม่สอดคล้องกัน วิธีแก้ปัญหานี้คือการใช้กับดัก
Traps เป็นวิธีที่ง่ายและมีประสิทธิภาพในการควบคุมเอาต์พุตของสคริปต์ทุบตี กลับไปที่สถานการณ์เริ่มต้นเดียวกันหากสคริปต์ถูกหยุดด้วยตนเองตัวอย่างเช่นด้วย ctrl-c จะถูกขัดจังหวะส่งคืนสัญญาณเอาต์พุต
INT
และถ้ามันลงท้ายด้วย
kill
จากนั้นผลลัพธ์จะเป็น
TERM
.
สามารถดูรหัสทางออกที่เป็นไปได้ทั้งหมดด้วย
kill -l
อย่างไรก็ตามส่วนใหญ่ใช้อย่างแม่นยำ
INT, ระยะ, ออก
หากสคริปต์ประกอบด้วยตัวอย่างเช่นการซิงโครไนซ์ไฟล์กับ
rsync
สิ่งที่สมเหตุสมผลที่สุดคือการพึ่งพาไฟล์ล็อคที่ไม่อนุญาตให้สคริปต์ทำงานพร้อมกัน:
LOCK = "/ var / run / rsync.lock" ถ้า [! -e $ LOCK]; จากนั้นแตะ $ LOCK rsync -avz foo bar rm $ LOCK else echo "rsync is already running" fi
ในภาษาสเปนล้วนสคริปต์ข้างต้นจะตรวจสอบว่ามีไฟล์ล็อกอยู่หรือไม่และหากไม่มีอยู่ระบบจะสร้างขึ้นและเรียกใช้คำสั่งที่เกี่ยวข้องในภายหลังจากนั้นจึงลบไฟล์ล็อก หากไฟล์มีอยู่สคริปต์จะส่งข้อความไปยังผู้ใช้ที่ระบุว่าคำสั่งนั้นทำงานอยู่แล้ว
อย่างไรก็ตามเมื่อมีสถานการณ์ที่เป็นปัญหาอาจเกิดขึ้นได้ว่าไฟล์ล็อคไม่ได้ถูกกำจัดออกไปซึ่งจะทำลายเอฟเฟกต์ที่ไม่ต้องการ วิธีแก้ปัญหานั้นง่ายมาก:
LOCK = "/ var / run / rsync.lock" ถ้า [! -e $ LOCK]; จากนั้นดัก "rm -f $ LOCK; exit" INT TERM EXIT แตะ $ LOCK rsync -avz foo bar rm $ LOCK trap - INT TERM EXIT else echo "rsync is already running" fi
ความพิเศษของโซลูชันนี้คือคำสั่งอยู่ในกับดักดังนั้นเมื่อได้รับสัญญาณ
INT, ระยะ, ออก
สคริปต์จะหยุดและล้างไฟล์ล็อก
เป็นที่น่ากล่าวว่าอาจมีสถานการณ์การแข่งขันในสคริปต์ด้านบนระหว่างเวลาที่ตรวจสอบไฟล์ล็อกและเวลาที่สร้างขึ้น ทางออกหนึ่งที่เป็นไปได้คือใช้โหมด noclobber ของการเปลี่ยนเส้นทางและ bash ซึ่งไม่เปลี่ยนเส้นทางไปยังไฟล์ที่มีอยู่:
LOCK = "/ var / run / rsync.lock" if (set -o noclobber; echo $$> "$ LOCK") 2> / dev / null; จากนั้นดัก 'rm -f "$ LOCK"; ออกจาก $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT else echo "rsync ทำงานอยู่แล้ว: $ (cat $ LCK)" fi
ความไม่ชอบมาพากลของหลังคือมันถูกใช้ตามที่ฉันได้กล่าวไปแล้วโหมด noclobber และไฟล์ล็อคมี PID ของกระบวนการที่กำลังดำเนินการ
นอกจากนี้ยังควรค่าแก่การกล่าวถึงว่ามีโซลูชันอื่น ๆ เช่น
flock
o
solo
อย่างไรก็ตามในโพสต์นี้ฉันต้องการแบ่งปันวิธีแก้ปัญหาด้วยทรัพยากรของ bash คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับกับดักได้จากสิ่งนี้ คำแนะนำที่ยอดเยี่ยม.
เยี่ยมมาก! ขอบคุณสำหรับการแบ่งปัน.
บทความที่ดีเพียงแค่เปลี่ยน 'echo' rsync กำลังทำงานอยู่แล้ว: $ (cat $ LCK) "'เป็น' echo" rsync กำลังทำงานอยู่แล้ว: $ (cat $ LOCK) "'
ความนับถือ
เป็นบทความที่น่าสนใจมากครับ! นี้ฉันเก็บไว้
เป็นคำสั่งที่มีประโยชน์มากที่ควรคำนึงถึง ฉันใช้มันในสคริปต์ที่ฉันเผยแพร่ในโพสต์เพื่อลบไฟล์บางไฟล์ที่สคริปต์สร้างขึ้นเมื่อหยุดทำงาน
น่าสนใจมากครับ