ฉันใช้เชลล์สคริปต์เพื่อตอบสนองต่อเหตุการณ์ของระบบและสถานะการอัปเดตจะแสดงในตัวจัดการหน้าต่างของฉัน ตัวอย่างเช่นหนึ่งสคริปต์กำหนดสถานะ wifi ปัจจุบันโดยการฟังหลายแหล่ง:
- เชื่อมโยง / แยกเหตุการณ์จาก wpa_supplicant
- การเปลี่ยนแปลงที่อยู่จาก ip (ดังนั้นฉันรู้ว่าเมื่อ dhcpcd ได้กำหนดที่อยู่)
- กระบวนการตัวจับเวลา (ดังนั้นความแรงของสัญญาณจะอัปเดตเป็นครั้งคราว)
เพื่อให้ได้มัลติเพล็กซ์ฉันต้องวางไข่กระบวนการพื้นหลัง:
{ wpa_cli -p /var/run/wpa_supplicant -i wlan0 -a echo &
ip monitor address &
while sleep 30; do echo; done } |
while read line; do update_wifi_status; done &
เช่นการตั้งค่าคือเมื่อใดก็ตามที่แหล่งที่มาของเหตุการณ์ส่งออกเป็นเส้นสถานะ wifi ของฉันจะอัปเดต ไปป์ไลน์ทั้งหมดทำงานในพื้นหลัง (สุดท้าย '& amp;') เพราะฉันดูแหล่งของเหตุการณ์อื่นที่ทำให้สคริปต์ของฉันสิ้นสุดลง:
wait_for_termination
kill $!
การฆ่าควรจะทำความสะอาดกระบวนการพื้นหลัง แต่ในรูปแบบนี้มันไม่ทำงาน กระบวนการ 'wpa_cli' และ 'ip' อยู่รอดอย่างน้อยที่สุดและไม่ตายในเหตุการณ์ถัดไปของพวกเขา (ในทางทฤษฎีแล้วพวกเขาควรจะได้รับ SIGPIPE ฉันคิดว่ากระบวนการอ่านจะต้องมีชีวิตอยู่ด้วย)
คำถามคือจะทำ [และอย่างหรูหรา!] ให้ทำความสะอาดกระบวนการพื้นหลังทั้งหมดที่เกิดขึ้นได้อย่างไร