2016-07-27 3 views
0

Irgendwie scheint es, als würde ./program | tee /dev/null seine Ausgabe verbrauchen. Wenn es einzeln ausgeführt wird, druckt das Programm etwas Text und läuft dann weiter, während es über UDP-Sockets kommuniziert. Es produziert eine Menge von Protokollnachrichten, die ich gefiltert anzeigen wollte, also habe ich versucht, ./program | grep -v "I dont wan't to see logs like this!" | tail -f auszuführen, aber es produzierte keine Ausgabe. Ich gab ein wenig auf und entschied mich, nur die Ausgabe in eine andere Datei zu schicken, die ich dann mit meinem Editor untersuchen konnte, aber es ergab sich eine leere Datei.tee/dev/Nullverbrauch Eingang?

Das betreffende Programm wurde von einem Studenten geschrieben und so kann das Problem darin enthalten sein. Was könnte dieses Verhalten verursachen? Wie kann ich das korrigieren?

Zusammenfassung:

./program druckt output aber ./program | tee /dev/null nichts drucken. Problem möglicherweise innerhalb der Quelle von ./program, aber wie man es richtig sowieso benutzt?

+0

Vielleicht erkennt das Programm, ob stdout umgeleitet wird oder nicht? Oder vielleicht versucht es den Dateideskriptor des stdout handle zu ändern? Hast du die Quelle für das Programm? –

Antwort

1

Dies passiert im Allgemeinen, wenn das fragliche Programm überprüft, ob es mit einem Terminal verbunden ist und etwas anderes für Terminal gegenüber Nicht-Terminal tut. Der einfachste Weg, dies zu umgehen und erfaßt die Ausgabe sowieso ist Skript zu verwenden:

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

script wird das Programm in einem Pseudo-Terminal läuft (so wird es denkt, es ist an ein Endgerät angeschlossen ist) und schreiben die Ausgabe an /dev/stdout, die dann an grep weitergeleitet wird.

Sie könnten auch das -f Argument zu script, um es nach jedem Schreiben bündig Ausgabe machen (sonst werden die Dinge gepuffert vor dem Schreiben in die Rohrleitung).

+0

Danke, ich habe es versucht und es hat nicht funktioniert, aber es hat mir geholfen, das wahre Problem herauszufinden. Aus irgendeinem Grund enthält die Quelle den folgenden Code: 'if (! Fork()) {...}' sonst nichts ... also läuft es in einer Verzweigung, die das Problem verursacht. Wie auch immer, das Entfernen der sinnlosen Gabel hat es behoben. – LambdaBeta

+0

Nevermind, ich dachte, es hätte es behoben, aber es war nur die Ausgabe, nachdem ich das Programm gesendet hatte. Ähnliche Ergebnisse mit Ihrer 'Skript'-Lösung, die korrekt gedruckt und abgetippt wurde, aber nicht live aktualisiert wird. Live-Updates treten nur dann auf, wenn das Programm ohne Pipes aufgerufen wird. Ich habe sogar fflush (stdout) hinzugefügt, um ... nix zu helfen. – LambdaBeta

+0

Wenn Sie möchten, dass es live aktualisiert wird und nicht, wenn das Programm beendet wird, müssen Sie die Option '-f' für das oben erwähnte Skript verwenden ... –