2016-07-27 8 views
0

Как-то кажется, что работает ./program | tee /dev/null потребляет его выход. Когда он запускается сам по себе, программа печатает некоторый текст, а затем продолжает работать при общении по сокетам UDP. Он создает много сообщений журнала, которые я хотел просмотреть в отфильтрованном виде, поэтому я попытался запустить ./program | grep -v "I dont wan't to see logs like this!" | tail -f, но он не выдал никаких результатов. Я немного сдался и решил сделать только вывод в другой файл, который я мог бы проверить с помощью моего редактора, но в результате появился пустой файл.tee/dev/null потребляющий вход?

Программа, о которой идет речь, была написана студентом, и поэтому проблема может быть в ней. Что может вызвать такое поведение? Как я могу это исправить?

Резюме:

./program печатает output но ./program | tee /dev/null ничего не печатает. Проблема, возможно, в источнике ./program, но как правильно ее использовать?

+0

Возможно, программа обнаруживает, перенаправлена ​​ли stdout или нет? Или, возможно, он пытается изменить дескриптор файла дескриптора stdout? У вас есть источник для программы? –

ответ

1

Это обычно происходит, когда рассматриваемая программа проверяет, подключена ли она к терминалу и что-то другое для терминалов и не-терминалов. Самый простой способ обойти это и захватить выход в любом случае является использование сценария:

script -c "./program" /dev/stdout | grep -v "I dont wan't to see logs like this!" | tail -f 

script будет запускать программу в псевдо-терминал (так он будет думать, что подключен к терминалу) и и писать выход до /dev/stdout, который затем передается по трубопроводу до grep.

Возможно, вам понадобится аргумент -f для script, чтобы сделать его сбросным после каждой записи (в противном случае все будет буферизоваться до записи в трубу).

+0

Спасибо, я попробовал это, и это не сработало, но это помогло мне разобраться в реальной проблеме. По какой-то причине исходный код содержит код: 'if (! Fork()) {...}' не более того ... поэтому его запуск в вилке, которая, как мне кажется, вызывает проблему. В любом случае, удаление бессмысленной вилки зафиксировано. – LambdaBeta

+0

Nevermind, я думал, что он исправил это, но он только выгружал выход, как только я нажал программу. Аналогичные результаты с вашим решением 'script', оно напечатано и правильно напечатано, но не будет обновляться вживую. Живые обновления все еще происходят, только если программа вызывается без каких-либо труб. Я даже добавил fflush (stdout), чтобы помочь ... нет. – LambdaBeta

+0

Если вы хотите, чтобы он обновлялся, а не когда программа завершалась, вам нужно использовать опцию '-f' для сценария, упомянутого выше ... –