grep из супер медленного непрерывного потокового журнала и выход, как только строка найдена без буфера - PullRequest
0 голосов
/ 25 января 2019

UPDATE:

С ответом @Tanktalus я понял, что это самая левая команда kubectl в буфере.

# will hang forever, because RHS pipe is broken, and LHS pipe need to send 
# the output to the pipe to realize the broken pipe, but as the buffer is 
# never filled, it's never broken
kubectl logs -f pod -n NAMESPACE | grep -q "Indicator"  

# put LHS to the background, because I don't care if it hang, I just need the log.
(kubectl logs -f pod -n NAMESPACE &) | grep -q "Indicator"  

Но у меня новая проблема, теперь зависают навсегда:
(kubectl logs -f pod -n NAMESPACE &)| tee log >(grep -q "Indicator")


ОРИГИНАЛЬНЫЙ ВОПРОС:
Прежде всего, это не повторяется с другими подобными вопросами, я прочитал их все. Тонкое отличие в том, что мой потоковый журнал неактивен сразу после индикатора строки, который я пытаюсь выполнить.

У меня есть непрерывный поток вывода журнала из модуля kubernetes. Строка индикатора «Индикатор» появится в конце приложения генератора журналов, и генератор журналов выйдет sleep infinity. Таким образом, журнал все еще будет передаваться в потоковом режиме, но не будет выводить новый вывод.

Я пытаюсь использовать канал | для перенаправления потокового журнала моего kubernetes, затем grep каждой строки журнала, пока я не найду «Индикатор», затем я хочу (немедленно) выйти. Команды, которые я пробовал, выглядят так:

# none of them worked, they all show the Indicator line, and then hangs forever.
kubectl logs -f pod -n NAMESPACE | tee test.log >(grep -q "Indicator")  
stdbuf -o 0 kubectl logs -f pod -n NAMESPACE | tee test.log >(grep -m1 "Indicator")
stdbuf -o 0 kubectl logs -f pod -n NAMESPACE | tee test.log >(grep -q --line-buffered "Indicator")
stdbuf -o 0 kubectl logs -f pod -n NAMESPACE | grep -q --line-buffered "Indicator"

Но поскольку после «индикатора» будет еще только одна строка журнала «+ Sleep infinity». Я предполагаю, что выходной буфер с самого левого конца канала не заполнен, и поэтому он не передается в grep?

Есть ли способ решить эту проблему?

1 Ответ

0 голосов
/ 25 января 2019

Я подозреваю, что из-за того, что kubectl не завершился, оболочка не продолжается. Если вы посмотрите на вывод ps, то заметите, что grep -m1 ... действительно завершается и больше не существует, но остальная часть канала все еще существует.

Так что я подозреваю, что вам нужно это инвертировать. В Perl, например, я бы использовал open, чтобы открыть канал для kubectl, читать выходные данные, пока не нашел то, что хотел, убить ребенка и выйти. В Си тоже самое с popen. Я не уверен, что bash дает такой уровень контроля.

Например:

 perl -E 'my $pid = open my $fh, "-|", qw(perl -E), q($|++; say for 1..10; say "BOOM"; say "Sleep Infinity"; sleep 50) or die "Cannot run: $!"; while(<$fh>) { if (/BOOM/) { say; kill "INT", $pid; exit 0 } }'

Вам придется заменить материал в open после "-|" своей собственной командой, а if (/BOOM/) - своим собственным регулярным выражением, но в противном случае он должен работать.

...