Читайте логи одного процесса во время выполнения какой-либо команды

10

У меня есть какой-то сервис, который производит журналы в файле logs.log.

У меня есть другая команда, которая взаимодействует с этим сервисом. Скажем так foo.sh.

Что мне нужно, это вырезать и сохранять логи logs.logточно во время foo.shработы. Другими словами, мне нужна эта часть журналов службы, когда она взаимодействует с моей foo.sh(поэтому меня не волнуют foo.shжурналы).

Я ожидаю, что эта команда добьется цели, но она продолжит чтение файла, когда foo.shуже закончит:

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

Есть ли хороший способ выполнить этот трюк?

Andremoniy
источник

Ответы:

12

Это делается довольно просто, отправляя фоновые процессы, ну, в общем, фон:

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

$!Захватывает PID последнего задания отправляется работать в фоновом режиме, так что мы можем waitна вашем сценарий до конца, а затем killв tailпроцессе , когда мы больше не нужно.

DopeGhoti
источник
3
удивительный ответ, узнал что-то новое сегодня
Мигель Мота
7

Эта версия может сделать это тоже (я думаю):

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

Обратите внимание, что% 1 попадет на первый фоновый процесс в подоболочке

Лучано Андресс Мартини
источник
Лично я предпочитаю фиксировать явные идентификаторы PID, а не использовать реестр заданий, поскольку все более сложная реализация этого может поставить более одной задачи в фоновом режиме и kill %1может привести к неверной цели.
DopeGhoti
1
Поскольку я использовал скобки для подоболочек, так что% 1 будет ссылаться на первое задание внутри подоболочки (но я не уверен в этом для всех оболочек). Очевидно, что ваше решение является более полным и функциональным для большего количества случаев, но я думаю, что оно может делать то, что нужно пользователю ... Другая проблема заключается в том, что моей версии нужно по крайней мере создание foo_part.log с помощью touch, а вашей версии - нет.
Лучано Андресс Мартини