Читання журналів з одного процесу під час виконання якоїсь команди


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на вашому сценарій до кінця, а потім killв tailпроцесі , коли ми більше не потрібно.


3
дивовижна відповідь, дізнався щось нове сьогодні
Мігель Мота

7

Ця версія також може це зробити (я думаю):

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

Зауважте, що% 1 потрапить на перший фоновий процес у підпакеті


Особисто я віддаю перевагу захопленню явних PID, а не використанню списку завдань, оскільки все більш складна реалізація цього завдання може поставити більше одного завдання на другий план і kill %1може отримати неправильну ціль.
DopeGhoti

1
Тому що я використовував дужки в скобках, тому% 1 буде посилатися на перше завдання всередині нижньої оболонки (але я не дуже впевнений у цьому для всіх оболонок). Очевидно, що ваше рішення є більш повним і функціональним для більшої кількості випадків, але я думаю, воно може робити те, що потрібно користувачеві .... Ще одна проблема полягає в тому, що моя версія потребує принаймні створення foo_part.log з дотиком, ваша версія - ні.
Лучано Андресс Мартіні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.