เหตุผลสำหรับผู้บริหารในสคริปต์ตัวตัด


27

ฉันได้เห็นตัวอย่างสคริปต์ wrapper ซึ่งโดยย่อมีดังต่อไปนี้:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

exec "$myprog" "$@"

เท่าที่เห็นข้างต้นที่พวกเขาใช้เพื่อแทนที่เปลือกที่สร้างขึ้นใหม่เกือบจะในทันทีด้วยexec $myprogหนึ่งสามารถบรรลุเดียวกันโดยไม่ต้องexec:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

"$myprog" "$@"

ในตัวอย่างล่าสุดนี้อินสแตนซ์ bash ใหม่จะเริ่มขึ้นและจากนั้น$myprogเริ่มต้นเป็นกระบวนการลูกของอินสแตนซ์ bash

ประโยชน์ของแนวทางแรกคืออะไร?



คำตอบ:


31

การใช้execทำให้ wrapper มีความโปร่งใสมากขึ้นนั่นคือทำให้ผู้ใช้หรือแอปพลิเคชันที่เรียกใช้สคริปต์ต้องระวังตัวน้อยลงว่ามันเป็นรีเลย์ที่ผลัดกันเปิดตัวโปรแกรม "ของจริง"

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

การโทรexecยังช่วยประหยัดหน่วยความจำเล็กน้อย (และแหล่งข้อมูลอื่น ๆ เช่น PID ฯลฯ ) เนื่องจากไม่จำเป็นต้องเก็บกระสุนพิเศษไว้โดยไม่เหลืออะไรให้ทำ

หากมีหลาย wrappers ปัญหาเพิ่มขึ้น (ความยากในการค้นหากระบวนการที่เหมาะสมในการฆ่า, โอเวอร์เฮดของหน่วยความจำ ฯลฯ )

เชลล์บางตัว (เช่น Korn เชลล์) จะตรวจจับโดยอัตโนมัติเมื่อคำสั่งเป็นอันสุดท้ายและไม่มีกับดักที่ใช้งานอยู่และวางโดยปริยายexecแต่ไม่ใช่ทั้งหมดที่ทำ (เช่นไม่ใช่ทุบตี)


10

การค้นหารายการที่ซ้ำกัน ... อ้างอิงถึงคู่มือ FreeBSDซึ่งให้เหตุผลที่ดีพอ:

execคำสั่งแทนที่กระบวนการเปลือกกับโปรแกรมที่ระบุ หากexecไม่ได้ระบุไว้กระบวนการเชลล์จะยังคงอยู่ในหน่วยความจำในขณะที่โปรแกรมกำลังทำงานและใช้ทรัพยากรระบบโดยไม่จำเป็น

ซึ่งเป็นหลักเหตุผลอธิบายให้ฉันค่อนข้างกลับ (โดยหนึ่งในผู้ขน) และเป็นที่รู้จักกันค่อนข้างดี

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