อ่านบันทึกจากกระบวนการหนึ่งระหว่างการรันคำสั่งบางอย่าง


10

logs.logฉันมีบริการบางส่วนซึ่งเป็นผู้ผลิตบันทึกในไฟล์

ฉันมีคำสั่งอื่นที่โต้ตอบกับบริการนี้ foo.shสมมติว่ามันเป็นบางส่วน

สิ่งที่ฉันต้องการคือการตัดและบันทึกบันทึกจากlogs.logว่าในระหว่างการfoo.shทำงาน กล่าวอีกนัยหนึ่งฉันต้องการบันทึกส่วนหนึ่งของบริการเมื่อมีการโต้ตอบกับของฉันfoo.sh(ดังนั้นฉันไม่สนใจfoo.shบันทึกของ)

ฉันคาดว่าคำสั่งนี้จะทำเคล็ดลับ แต่มันยังคงอ่านไฟล์เมื่อfoo.shเสร็จแล้ว:

> foo.sh | tail -f logs.log > foo_part.log

เป็นวิธีที่ดีในการทำเคล็ดลับนี้หรือไม่?

คำตอบ:


12

สิ่งนี้ทำค่อนข้างตรงไปตรงมาโดยส่งกระบวนการพื้นหลังของคุณไปยังพื้นหลัง:

foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid

$!จับ PID ของงานที่ผ่านมาส่งไปทำงานในพื้นหลังเพื่อให้เราสามารถwaitสคริปต์ของคุณให้เสร็จแล้วกระบวนการเมื่อเราไม่จำเป็นต้องใช้มันkilltail


3
คำตอบที่ยอดเยี่ยมเรียนรู้สิ่งใหม่วันนี้
มิเกลโมตา

7

รุ่นนี้สามารถทำได้ด้วย (ฉันคิดว่า):

( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 ) 

โปรดทราบว่า% 1 จะเข้าสู่กระบวนการพื้นหลังแรกในเชลล์ย่อย


โดยส่วนตัวแล้วฉันชอบที่จะจับ PID ที่ชัดเจนแทนที่จะใช้บัญชีรายชื่องานเนื่องจากการใช้งานที่ซับซ้อนมากขึ้นอาจทำให้มีงานมากกว่าหนึ่งงานในเบื้องหลังและkill %1อาจได้รับเป้าหมายที่ไม่ถูกต้อง
DopeGhoti

1
เนื่องจากฉันใช้วงเล็บย่อยดังนั้น% 1 จะอ้างถึงงานแรกที่อยู่ในเชลล์ย่อย (แต่ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้สำหรับเชลล์ทั้งหมด) เห็นได้ชัดว่าโซลูชันของคุณสมบูรณ์และใช้งานได้มากขึ้น แต่ฉันคิดว่ามันสามารถทำสิ่งที่ผู้ใช้ต้องการได้ ... ปัญหาอีกอย่างคือรุ่นของฉันต้องการอย่างน้อยการสร้าง foo_part.log ด้วยการสัมผัสเวอร์ชันของคุณทำไม่ได้
Luciano Andress Martini
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.