เนื่องจากคำสั่งดังกล่าวจะทำงานและ (หวังว่าจะ) เสร็จสมบูรณ์ในเบื้องหลัง ฉันจึงไม่สามารถรับสถานะออกได้ ไม่เป็นไร
ข้อความนี้ไม่ถูกต้องที่จะเริ่มต้นด้วย:
#!/bin/bash
some_command &
pid="$!"
รอ -n "$pid"
echo "สถานะคือ ${?}"
หากคุณต้องการรับการแจ้งเตือนทันที คุณสามารถใช้เคล็ดลับตามสัญญาณบางอย่างได้
การจัดการของ SIGCHLD
จะเป็นตัวเลือกที่ชัดเจนที่สุด แต่ (1) รองรับใน Bash เป็นรถ และ (2) แม้ว่า ชุด -b
, กับดัก
ตัวจัดการจะรอขอบเขตคำสั่ง
ที่กล่าวว่าเป็นตัวเลือกที่ดีที่สุดถัดไป (ซึ่งขัดจังหวะการประมวลผลเบื้องหน้าที่ใช้เวลานาน โดยทันที เมื่อไร some_command
ล้มเหลว) คือ (เทียบเท่ากับ) สร้าง Ctrl+C สำหรับกลุ่มกระบวนการทั้งหมดของคุณ สิ่งนี้จะถูกส่งและดำเนินการทันที ตัวเชลล์เองสามารถจัดการกับสัญญาณและดำเนินการต่อได้หากต้องการ ในขณะที่กระบวนการเบื้องหน้าจะออกโดยค่าเริ่มต้น เป็นต้น
#!/bin/bash
ตั้ง -e
ตัวจัดการ () {
echo 'สัญญาณล้มเหลวของคำสั่ง'
กับดัก - INT
}
ตัวจัดการกับดัก INT
พื้นหลัง() {
ท้องถิ่น -ir pid="$1"
กะ
"$@" || ฆ่า -INT -- -"$pid"
}
พื้นหลัง "$$" some_command &
# งานเบื้องหน้าที่ใช้เวลานาน
echo 'ก่อนการประมวลผลแบบยาว'
นอน 5 || echo 'การประมวลผลที่ยาวนานถูกขัดจังหวะ'
echo 'หลังจากประมวลผลนาน'
ลองเปลี่ยน some_command
ด้วย (เช่น) นอน2
เพื่อทดสอบกรณี "สำเร็จ"