Đọc nhật ký từ một tiến trình trong khi chạy một số lệnh


10

Tôi có một số dịch vụ tạo ra các bản ghi trong tệp logs.log.

Tôi có một số lệnh khác tương tác với dịch vụ này. Hãy nói nó là một số foo.sh.

Những gì tôi cần, là cắt và lưu nhật ký từ logs.logchính xác trong khi foo.shchạy. Nói cách khác, tôi cần một phần nhật ký của dịch vụ khi nó tương tác với nhật ký của tôi foo.sh(vì vậy tôi không quan tâm đến foo.shnhật ký của chúng tôi).

Tôi hy vọng rằng lệnh này sẽ thực hiện thủ thuật, nhưng nó tiếp tục đọc tệp khi foo.shđã hoàn thành:

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

Có cách nào hay để thực hiện thủ thuật này không?

Câu trả lời:


12

Điều này được thực hiện khá đơn giản bằng cách gửi các quy trình nền của bạn tới, nền tảng:

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

$!nắm bắt được PID của công việc cuối cùng được gửi để chạy trong nền, vì vậy chúng ta có thể waittrên kịch bản của bạn để hoàn thành, và sau đó killtailquá trình khi chúng ta không còn cần nó nữa.


3
câu trả lời tuyệt vời, đã học được điều gì đó mới hôm nay
Miguel Mota

7

Phiên bản này cũng có thể làm điều đó (tôi nghĩ):

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

Lưu ý rằng% 1 sẽ đạt quy trình nền đầu tiên trong lớp con


Cá nhân, tôi thích nắm bắt các PID rõ ràng hơn là sử dụng bảng phân công công việc, vì việc triển khai ngày càng phức tạp này có thể đặt nhiều hơn một nhiệm vụ trong nền và kill %1có thể nhận sai mục tiêu.
DopeGhoti

1
Bởi vì tôi đã sử dụng dấu ngoặc đơn con nên% 1 sẽ đề cập đến công việc đầu tiên bên trong lớp con (nhưng tôi không chắc về điều này cho tất cả các shell). Rõ ràng giải pháp của bạn đầy đủ và chức năng hơn cho nhiều trường hợp, nhưng tôi nghĩ nó có thể làm những gì người dùng cần .... Một vấn đề khác là phiên bản của tôi cần ít nhất là tạo foo_part.log bằng cảm ứng, phiên bản của bạn thì không.
Luciano Andress Martini
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.