กับดัก: ทำให้สคริปต์ทุบตีของคุณมีประสิทธิภาพมากขึ้น

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

ทำให้สคริปต์ทุบตีของคุณมีประสิทธิภาพมากขึ้นด้วยกับดัก

ลองนึกภาพว่าคุณมีสคริปต์ทุบตีที่ทำงานทุกวันทุกหกชั่วโมงและเมื่อถึงจุดหนึ่งมันก็ล้มเหลวหรือสคริปต์เดียวกันนั้นทำงานสองครั้งพร้อมกัน สถานการณ์ทั้งสองนี้ค่อนข้างอึดอัดเนื่องจากจำเป็นต้องมีการแทรกแซงของมนุษย์เพื่อแก้ไขหรือในบางช่วงก็ไม่สามารถแก้ไขได้ทำให้ระบบอยู่ในสถานะที่ไม่สอดคล้องกัน วิธีแก้ปัญหานี้คือการใช้กับดัก

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 คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับกับดักได้จากสิ่งนี้ คำแนะนำที่ยอดเยี่ยม.


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   ราฟาเอลคาสโตร dijo

    เยี่ยมมาก! ขอบคุณสำหรับการแบ่งปัน.

  2.   nx dijo

    บทความที่ดีเพียงแค่เปลี่ยน 'echo' rsync กำลังทำงานอยู่แล้ว: $ (cat $ LCK) "'เป็น' echo" rsync กำลังทำงานอยู่แล้ว: $ (cat $ LOCK) "'

    ความนับถือ

  3.   ดีลังโกส dijo

    เป็นบทความที่น่าสนใจมากครับ! นี้ฉันเก็บไว้

  4.   Joaquin dijo

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

  5.   ดานี่ เอฟ.พี dijo

    น่าสนใจมากครับ