สคริปต์ทุบตีดำเนินการร่วมกันไม่ได้ฆ่ากระบวนการพื้นหลัง
ฉันมีเชลล์สคริปต์จำนวนหนึ่งที่ทำงานคล้ายกับคำถามนี้มาก แต่ละสคริปต์ใช้งานแบ็คกราวนด์ไม่กี่ครั้งจดจำการ PID ด้วย$!ทำการทดสอบบางอย่างแล้วฆ่ากระบวนการพื้นหลัง ปัญหาของฉันคือฉันต้องการเรียกใช้สคริปต์ประเภทนี้จำนวนมาก หากฉันเรียกใช้ด้วยตนเองทีละคนพวกเขาทำงานได้ดี: ps -aแสดงว่ากระบวนการพื้นหลังถูกฆ่าอย่างเหมาะสม $ ./test_1.sh $ ./test_2.sh อย่างไรก็ตามถ้าฉันใช้ทั้งสองในหนึ่งคำสั่งเช่นนั้น: $ ./test_1.sh; ./test_2.sh กระบวนการพื้นหลังเริ่มต้นโดยtest_1.shล้มเหลวที่จะตายตามเวลาtest_2.shเริ่มต้น สิ่งนี้ทำให้พอร์ตเชื่อมโยงกันซึ่งtest_2.shจำเป็นต้องเชื่อมโยง ดังนั้นแม้ว่าtest_1.shปัญหาที่ถูกต้องkillคำสั่งเกิดปัญหาถ้ามันดำเนินการทันทีหลังจากที่test_2.shtest_1.sh หากฉันแทรกการหน่วงเวลาระหว่างสคริปต์ไม่มีปัญหา: $ ./test_1.sh; sleep 1; ./test_2.sh จากนั้นสันนิษฐานว่ามีความล่าช้าระหว่างเมื่อkillมีการออกและเมื่อกระบวนการตายจริงและปล่อยพอร์ต คำถามของฉันคือ: เกิดอะไรขึ้น? แพลตฟอร์มนี้เฉพาะเจาะจงหรือไม่ ฉันใช้ Mac OS X แต่สิ่งนี้ดูเหมือนจะไม่เป็นปัญหาสำหรับคนที่เขียนสคริปต์บน Linux มาก่อน มีวิธีที่ดีกว่าเพื่อให้แน่ใจว่ากระบวนการเบื้องหลังถูกฆ่าโดยไม่ใช้sleepระหว่างสคริปต์หรือไม่ เพื่อความสมบูรณ์นี่คือลักษณะของสคริปต์ทดสอบตัวใดตัวหนึ่ง: #!/bin/sh echo "starting up server 1(parent)..." $JAVA siena.StartServer -port 7000 & server1=$! …