จะใช้ Ctrl + C เพื่อฆ่าโพรเซสพื้นหลังทั้งหมดที่เริ่มต้นในสคริปต์ Bash ได้อย่างไร?


9

ArchLinux (Manjaro)

ฉันใช้ไฟล์ทุบตีหนึ่งไฟล์ มันทำงาน 2 กระบวนการ (คำสั่ง) &โดยใช้ แต่เมื่อฉันกดCtrl+ Cเพื่อหยุดโปรแกรม - หนึ่งกระบวนการตายและอีกกระบวนการหนึ่งทำงานต่อไป

ฉันจะหยุดกระบวนการทั้งสองได้อย่างไร หรือฉันจะเขียนสคริปต์ใหม่เพื่อฆ่าสองกระบวนการนี้ได้อย่างไร

คำตอบ:


13

อัปเดต: trapต้องลบSIGคำนำหน้าตามเงื่อนไขแม้ว่าบางเชลล์รองรับ ดูความคิดเห็นด้านล่าง

เครื่องหมาย & "&" รันคำสั่งในพื้นหลังในกระบวนการใหม่ เมื่อกระบวนการหลักของมัน (คำสั่งที่รันสคริปต์ bash ในกรณีของคุณ) สิ้นสุดลงกระบวนการพื้นหลังนี้จะรีเซ็ตกระบวนการหลักเป็น init (ดำเนินการด้วยPID1) แต่จะไม่ตาย เมื่อคุณกดctrl+cคุณกำลังส่งสัญญาณขัดจังหวะไปยังกระบวนการพื้นหน้าและมันจะไม่ส่งผลกระทบต่อกระบวนการพื้นหลัง

เพื่อฆ่ากระบวนการพื้นหลังที่คุณควรใช้killคำสั่งกับของกระบวนการพื้นหลังล่าสุดซึ่งอาจจะได้รับจากPID$!

หากคุณต้องการที่จะใช้ctrl+cเพื่อฆ่าทั้งกระบวนการสคริปต์และพื้นหลังคุณสามารถทำได้:

trap 'kill $BGPID; exit' INT
sleep 1024 &    # background command
BGPID=$!
sleep 1024      # foreground command of the script

trapแก้ไขตัวจัดการกับดักของ SIGINT( trapต้องการลบส่วนSIGนำหน้า แต่เชลล์บางตัวอาจสนับสนุนรวมถึง) เพื่อให้สคริปต์จะฆ่ากระบวนการด้วย$BGPIDก่อนที่จะออก


การใช้ "trap 'kill $ BGPID; exit" SIGINT "ฉันได้รับ" SC2039: ใน POSIX sh ชื่อสัญญาณนำหน้าด้วย' SIG 'จะไม่ได้กำหนดไว้ ฉันคิดว่าคุณต้องเขียนกับดัก 'kill $ BGPID; ออก 'INT
Hettomei

@Hettomei ขอบคุณสำหรับการป้อนข้อมูล ฉันตรวจสอบหน้า man ของแทร็ปอีกครั้งและพบว่าสิ่งที่คุณแนะนำเป็นจริง: มาตรฐานต้องการเงื่อนไข (สัญญาณทริกเกอร์) ไม่ควรมีคำนำหน้า SIG และการสนับสนุนคำนำหน้า SIG เป็นส่วนเสริม อัปเดตคำตอบเดิม pubs.opengroup.org/onlinepubs/009695399/utilities/trap.html
lyang

1

โปรแกรมสามารถละเว้นCtrl+cสัญญาณเนื่องจากสามารถละเว้น SIGTSTP ได้เช่นกัน

คุณสามารถลองCtrl+zเปลือกหอยส่วนใหญ่ได้

มีสัญญาณบางอย่างที่กระบวนการไม่สามารถข้ามได้: SIGKILL, SIGSTOP คุณสามารถส่งคำสั่ง kill เพื่อฆ่ากระบวนการแช่แข็งของคุณคุณจะต้องค้นหา ID กระบวนการ (PID)
ใช้ pgrep หรือ ps แล้วฆ่ามัน

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