ฉันกำลังพยายามกำหนดค่าสคริปต์เริ่มต้นซึ่งจะเริ่มต้น Tomcat ตรวจสอบ catalina.out สำหรับสตริง "Server startup" แล้วเรียกใช้กระบวนการอื่น ฉันได้ลองใช้ชุดต่าง ๆ ของ tail -f กับ grep และ awk แต่ยังไม่ได้ทำงานอะไรเลย ปัญหาหลักที่ฉันดูเหมือนจะบังคับให้หางตายหลังจาก grep หรือ awk จับคู่กับสตริง
ฉันทำให้การทดสอบต่อไปนี้ง่ายขึ้น
test.sh is listed below:
#!/bin/sh
rm -f child.out
./child.sh > child.out &
tail -f child.out | grep -q B
child.sh is listed below:
#!/bin/sh
echo A
sleep 20
echo B
echo C
sleep 40
echo D
พฤติกรรมที่ฉันเห็นคือ grep ออกหลังจาก 20 วินาทีอย่างไรก็ตามหางจะใช้เวลาอีก 40 วินาทีในการตาย ฉันเข้าใจว่าทำไมสิ่งนี้จึงเกิดขึ้น - หางจะสังเกตเห็นว่าไปป์นั้นหายไปเมื่อมันเขียนลงไปซึ่งจะเกิดขึ้นเมื่อข้อมูลถูกผนวกเข้ากับไฟล์ นี่ประกอบไปด้วยความจริงที่ว่าหางจะต้องบัฟเฟอร์ข้อมูลและเอาท์พุทอักขระ B และ C เป็นการเขียนครั้งเดียว (ฉันยืนยันสิ่งนี้ด้วย strace) ฉันพยายามแก้ไขด้วยวิธีแก้ปัญหาที่พบที่อื่นเช่นใช้คำสั่ง unbuffer แต่ไม่ได้ช่วย
มีใครมีความคิดเห็นเกี่ยวกับวิธีทำให้การทำงานนี้เป็นไปตามที่ฉันคาดหวัง หรือแนวคิดสำหรับการรอ Tomcat ที่ประสบความสำเร็จในการเริ่มต้น (คิดเกี่ยวกับการรอให้พอร์ต TCP รู้ว่ามันเริ่มต้นแล้ว แต่สงสัยว่ามันจะซับซ้อนกว่าที่ฉันพยายามทำอยู่ตอนนี้) ฉันจัดการเพื่อให้มันทำงานกับ awk ทำ "killall tail" ในการแข่งขัน แต่ฉันไม่พอใจกับวิธีแก้ปัญหานั้น หมายเหตุฉันพยายามทำให้มันใช้งานได้กับ RHEL4