Ctrl-C ในสคริปต์ทุบตี


22

ฉันจะใช้การจัดการctrl+ cในสคริปต์ทุบตีได้อย่างไรเพื่อให้สคริปต์ถูกขัดจังหวะรวมถึงคำสั่งที่รันอยู่ในปัจจุบันซึ่งเปิดตัวโดยสคริปต์

(ลองนึกภาพว่ามีสคริปต์ที่รันคำสั่งที่ใช้เวลานานผู้ใช้กดctrl+ cและขัดจังหวะคำสั่ง แต่สคริปต์ดำเนินไป) ฉันต้องการให้มันทำงานในลักษณะที่ทั้งคู่ถูกฆ่า


1
หากระบบปฏิบัติการของคุณเปิดใช้งานการควบคุมงานตัวเลือกอื่นจะหยุดสคริปต์นั้น (โดยทั่วไปคือ crtl-z) คุณสามารถดำเนินงานในพื้นหลังกับที่ฆ่ามันหรือยังคงไว้ในเบื้องหน้าด้วยbg ดูในส่วนทุบตีfg manpage JOB CONTROL
ott--

คำตอบ:


25

คุณทำเช่นนี้โดยการสร้างงานย่อยที่คุณต้องการเรียกเมื่อ SIGINT trap 'subroutinename' INTจะได้รับและคุณจำเป็นต้องเรียกใช้

ตัวอย่าง:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0

2
โปรดทราบว่าคุณสามารถดักจับEXITในกรณีที่คุณมีบางสิ่งที่คุณต้องการดำเนินการเมื่อสคริปต์ออกโดยไม่คำนึงว่าสคริปต์จะหยุดทำงานอย่างไร ( KILLยกเว้นแน่นอน)
Blrfl

เยี่ยมมากขอบคุณ! อย่างไรก็ตามเมื่อ 'นอน' ถูกฆ่า - เชลล์ยังคงสามารถจัดการเพื่อรันคำสั่งถัดไปขณะที่รูทีน trap กำลังทำงาน: 'echo' ในกรณีนี้ ... หรือฉันผิด?
kolypto

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