Lesen mit Katze: Stoppen, wenn keine Daten empfangen werden

8

Gibt es eine Möglichkeit, dem Befehl cat zu sagen, dass er aufhören soll zu lesen, wenn er keine Daten empfängt? vielleicht mit einem "timeout", der angibt, wie lange keine Daten eingehen.

Irgendwelche Ideen?

    
Kai 01.09.2011, 12:56
quelle

6 Antworten

5

Es gibt einen Befehl timeout(1) . Beispiel:

%Vor%     
Michał Šrajer 01.09.2011 13:05
quelle
5

cat selbst, nein. Es liest den Eingabestrom, bis das Ende der Datei angegeben ist, und blockiert bei Bedarf die Eingabe.

Es gibt nichts, was Sie daran hindert, Ihr eigenes cat -Äquivalent zu schreiben, das select bei der Standardeingabe verwendet, um eine Zeitüberschreitung zu erreichen, wenn nichts schnell genug kommt und Sie unter diesen Bedingungen beenden.

Tatsächlich habe ich einmal ein snail -Programm geschrieben (weil eine Schnecke langsamer ist als eine Katze), die ein zusätzliches Argument von Zeichen pro Sekunde brauchte, um langsam eine Datei (a) .

So snail 10 myprog.c würde myprog.c mit zehn Zeichen pro Sekunde ausgeben. Für das Leben von mir kann ich mich nicht erinnern, warum ich das getan habe - ich vermute, ich habe nur herumgemurkst und darauf gewartet, dass eine echte Arbeit auftaucht.

Da Sie Probleme damit haben, ist hier eine Version von dog.c (basierend auf meinem oben erwähnten snail -Programm), die tun wird, was Sie wollen:

%Vor%

%Vor%

Dann können Sie einfach dog ohne Argumente ausführen (so wird die Standardeingabe verwendet) und nach fünf Sekunden ohne Aktivität wird Folgendes ausgegeben:

%Vor%

(a) Eigentlich wurde es slowcat genannt, aber snail ist viel schöner und ich bin nicht über ein bisschen weniger Revisionismus, wenn es die Geschichte besser klingen lässt: -)

    
paxdiablo 01.09.2011 13:02
quelle
1

Hier ist der Code für timeout-cat:

%Vor%

Es ist im Grunde dasselbe wie Paxdiablos Hund. Es funktioniert als cat ohne ein Argument - catting the stdin. Als erstes Argument liefern wir Timeout Sekunden.

Eine Einschränkung (gilt auch für den Hund) - Linien sind liniengepuffert, so dass Sie n-Sekunden haben, um eine Linie (kein Zeichen) zum Zurücksetzen des Timeout-Alarms bereitzustellen. Dies ist wegen readline.

Verwendung :

statt potenziell endlos:

%Vor%

Sie können Code oben zu timeout_cat und:

kompilieren %Vor%     
Michał Šrajer 01.09.2011 16:38
quelle
0

Versuchen Sie, Schwanz -f --pid zu betrachten Ich nehme an, dass Sie eine Datei lesen und wenn der Produzent fertig ist (weg?), Hören Sie auf.

Beispiel, das / var / log / messages verarbeitet, bis watcher.sh beendet ist.

%Vor%     
Grzegorz 17.10.2012 22:44
quelle
0

mbuffer , mit der Option -W , funktioniert für mich.

Ich musste stdin in eine Datei setzen, aber mit einem Timeout im Leerlauf:

  • Ich musste nicht mehrere Quellen verketten (aber vielleicht gibt es Möglichkeiten, mbuffer dafür zu verwenden.)
  • Ich habe keine der möglichen Ausgabeformatierungsoptionen von cat benötigt.
  • Es hat mir nichts ausgemacht, dass der Fortschrittsbalken mbuffer auf den Tisch bringt.

Ich musste -A /bin/false hinzufügen, um eine Warnung zu unterdrücken, basierend auf einem Vorschlag in der verknüpften Manpage. Mein Aufruf zum Kopieren von stdin in eine Datei mit 10 Sekunden Leerlauf-Timeout sah schließlich wie

aus %Vor%     
phs 07.11.2017 23:14
quelle
-1

Einfach Katze dann töten Sie die Katze nach 5 sec.

%Vor%

Erhalte die Katzenausgabe als Antwort nach 5 Sekunden

%Vor%     
Oguz 02.03.2016 13:18
quelle

Tags und Links