สคริปต์ Bash ควรฆ่าอินสแตนซ์เหล่านั้นของสคริปต์อื่นที่เปิดตัว


11

ในสถานการณ์ปัจจุบันบางสคริปต์ 'calling.sh' เปิดตัวอีกสคริปต์ 'called.sh' ในพื้นหลังดำเนินการดำเนินการอื่น ๆ นอนในขณะที่แล้วสิ้นสุด 'called.sh' pkill called.shด้วย มันใช้งานได้ดี

จากนั้นฉันก็อยากจะเปิดตัว 'เรียกว่า. sh' จากเทอร์มินัลอื่นเป็นสคริปต์แบบสแตนด์อโลนในเวลาอื่น ๆ ไม่ว่าจะก่อนหรือหลังการเปิดตัว calls.sh อินสแตนซ์อิสระเหล่านี้ไม่ควรถูกฆ่าโดย 'calling.sh'

ฉันจะบรรลุสิ่งนี้ได้อย่างไร สัญชาตญาณบอกว่าสคริปต์การโทรควรจะสามารถบอกกระบวนการที่เริ่มต้นจากชื่ออื่น ๆ ที่กำลังทำงานอยู่ในขณะเดียวกัน

ในฐานะที่เป็นตัวแปร 'calling.sh' อาจเปิดตัว 'เรียกว่า' ซึ่งเป็นลิงก์สัญลักษณ์ไปยัง 'เรียกว่า' sh ' สิ่งนี้ซับซ้อนกว่าการจัดการสถานการณ์ข้างต้นหรือไม่? ข้อควรระวังและการปรับเฉพาะใดที่ใช้ลิงค์สัญลักษณ์จำเป็นต้องใช้?


1
ฉันเชื่อว่า unshare มีลักษณะเฉพาะสำหรับสิ่งนี้: unix.stackexchange.com/a/450242/323121
Rusi

คำตอบ:


27

อย่าใช้ชื่อเพื่อฆ่ามัน เนื่องจากcalling.shสคริปต์กำลังเรียกกระบวนการที่คุณต้องการฆ่าในภายหลังให้ใช้$!(จากman bash):

! ขยายไปยัง ID กระบวนการของงานที่วางไว้ล่าสุดเป็นพื้นหลังไม่ว่าจะดำเนินการเป็นคำสั่งแบบอะซิงโครนัสหรือใช้งานใน bgตัว

ดังนั้นหากคุณcalling.shเป็นเช่นนี้:

called.sh &
## do stuff
pkill called.sh

เปลี่ยนเป็น:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"

4
สิ่งนี้จะทำงานได้ตราบใดที่เรียกว่า. sh ไม่ได้ตายด้วยตัวเองเพราะไม่เช่นนั้น pid อาจถูกนำกลับมาใช้ใหม่จะฆ่ากระบวนการที่ไร้เดียงสาและไม่เกี่ยวข้อง
Eugene Ryabtsev

2
@EugeneRyabtsev เป็นจุดที่ดีมาก ผมคิดว่าคุณยังสามารถตรวจสอบว่า$calledPidผู้ปกครอง PID PID called.shเป็นของ
terdon

เพื่อเสริมคำตอบนี่เป็นอีกแหล่งข้อมูลที่ฉันพบว่ามีประโยชน์ในการจัดระเบียบความคิดของฉัน: mywiki.wooledge.org/ProcessManagement
XavierStuvw

18

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

Inside of calling.sh คุณควรบันทึก PID ของงานที่คุณได้เริ่มและฆ่าพวกเขาอย่างชัดเจนด้วย PID

ภายในโทร. sh:

./called.sh &
called_pid=$!

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