ฉันมีเชลล์สคริปต์จำนวนหนึ่งที่ทำงานคล้ายกับคำถามนี้มาก แต่ละสคริปต์ใช้งานแบ็คกราวนด์ไม่กี่ครั้งจดจำการ 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.sh
test_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=$!
sleep 2
echo "starting up server 2(the first child)..."
$JAVA siena.StartServer -port 2000 -master senp://:7000 > outputs/test.out2 &
server2=$!
echo "starting up server 3(the second child)..."
$JAVA siena.StartServer -port 3000 -master senp://:7000 > outputs/test.out2 &
server3=$!
sleep 5
kill $server1
kill $server2
kill $server3
kill
ส่งสัญญาณไปยังกระบวนการเท่านั้นมันไม่ได้ตรวจสอบจริงๆว่ากระบวนการนั้นถูกฆ่าแล้ว โดยปกติแล้ว aSIGTERM
จะถูกส่งซึ่งกระบวนการสามารถเพิกเฉยได้ แม้ว่ามันจะสอดคล้องกับมันก็อาจยังคงทำความสะอาดบ้านก่อนที่มันจะยุติจริง วิธีที่เร็วกว่าคือการฆ่าด้วยสัญญาณSIGKILL
อย่างไรก็ตามกระบวนการจะไม่มีโอกาสที่จะกำจัดบัฟเฟอร์เช่นและมันจะยังคงไม่เกิดขึ้นทันที ฉันคิดว่าวิธีที่ปลอดภัยกว่าคือการสำรวจ/proc/<PROCID>
เส้นทางหากมีอยู่ในระบบของคุณ