В настоящее время я перенаправляю вывод инструмента мониторинга в файл, однако я хотел бы перенаправить этот вывод в новый файл по моему запросу (используя привязку клавиш), не останавливая указанный инструмент.
Что-то вроде
monitor_program | handle_stdout
Где handle_stdout
позволяет мне определить новый файл, куда поместить журнал в определенной точке.
Я знаю, что мог бы легко написать это, но мне интересно, есть ли инструмент, который уже позволяет это.
bash
pipe
io-redirection
stdout
Тревиньо
источник
источник
logrotate
пользовательский конфигурационный файл вручную, в зависимости от поведения вашей monitor_program, но это несколько странно.Ответы:
Я предложу именованную трубу.
Создайте канал
mkfifo p
(назовите его как хотите, если не 'p')Создайте скрипт «reader», который читает из канала и пишет где угодно
Скажите программе мониторинга, чтобы она записывала свои логи в именованный канал
Вот пример сценария чтения, который читает из именованного канала 'p' и записывает данные в индексированный файл 'mylog':
источник
read
аprintf
не простоcat <p >> mylog."$INDEX"
?Основываясь на своей идее SIGINT, здесь с помощью SIGQUIT ( Ctrl+\) вы все равно можете использовать, Ctrl+Cчтобы остановить все это:
Это предполагает, что
cat
это не встроенная функция в вашей оболочке (поэтому она прерывается при нажатии Ctrl+\).Обратите внимание, что, как и в вашем подходе, есть вероятность, что SIGQUIT будет доставлен в неправильное время (в системном вызове write), что приведет к потере некоторых данных.
источник
Вы могли бы, вероятно, использовать
less
и сохранить оттуда, набрав sзатем имя файла, в который вы хотите сохранить, затем Enter. От Как мне записать все строки из меньшего в файл? ,источник
Не зная больше о вашем «запросе», на него невозможно ответить. Если бы он был основан на размере файла или интервале, то rotatelogs (который должен идти в комплекте с Apache httpd) работал бы.
источник
Благодаря ответу Джеффа Шаллера у меня получилось что-то вроде этого, которое в основном делает то, что мне нужно, назовем это так
reader.sh
:Затем речь идет о создании именованного канала с
mkfifo p
использованием двух терминалов, гдеmonitor_program > p
иreader.sh
работают. Затем я могу остановить читателя, чтобы установить новый журнал, используя Ctrl+ C, и ввести новое имя. Ctrl+ Z, как обычно, чтобы остановить и убить его.источник