Named Pipes funktionieren anscheinend nicht?

351
jov14

Ich versuche, Named Pipes als bequeme Möglichkeit zu verwenden, um Eingaben für Pipelines, die leider keine Daten direkt aus stdin akzeptieren, zeitnah vorzuverarbeiten.

Überall, wo ich nach Informationen suche, bekomme ich im Grunde das gleiche Prinzip: Named Pipes sollten einfach zu verwenden sein.

Im Kern geht es meistens darum, dass Folgendes funktionieren sollte:

mkfifo mynamedpipe echo "is this working?" > mynamedpipe cat mynamedpipe

Wenn ich renne mkfifo mynamedpipe, ist das Rohr erfolgreich erstellt und mit sichtbar ls *.

Aber selbst nachdem ich mir selbst die Erlaubnis zum Schreiben erteilt habe, echo "whatever" > mynamedpipepassiert nichts, wenn ich versuche zu laufen, und das Terminal hängt einfach, bis ich den Prozess mit beendet habe ctrl+c.

Ich habe dieses Problem auf meinem lokalen Linux-Rechner (Ubuntu 14.04.5 LTS) sowie auf einem öffentlichen Server (Red Hat Enterprise Linux 7) und in zsh sowie in bash.

Was mache ich hier falsch?

1
probiere `cat <mynamedpipe '. Beachten Sie auch dieses Zitat aus https://www.linuxjournal.com/article/2156: "Wenn Sie genau hinschauen, werden Sie feststellen, dass der erste Befehl, den Sie ausführen, scheinbar hängen bleibt. Dies geschieht, weil das andere Ende der Pipe nicht funktioniert noch verbunden, und der Kernel unterbricht den ersten Prozess, bis der zweite Prozess die Pipe öffnet. In Unix-Jargon heißt der Prozess "blockiert", da er darauf wartet, dass etwas passiert. " Frank Thomas vor 5 Jahren 1
Danke, das klärt mich auf. Es ist jedoch ärgerlich, dass praktisch jedes Tutorial zu diesem Thema (oder zumindest alle prominentesten Google-Treffer) genau die grundlegenden Schritte beschreibt, die ich oben gepostet habe, und besagt, dass sie "wie sie sind" arbeiten sollte, ohne dieses Problem anzugehen. Hat sich das in letzter Zeit geändert? jov14 vor 5 Jahren 0
Sie sollten den Leser ("cat mynamedpipe") ** zuerst ** verwenden. Was bedeutet, dass Sie zwei Terminals benötigen. Das riecht auch nach einer [XY-Frage] (https://meta.stackexchange.com/questions/66377/what-is-the-xy- problem). Bitte erläutern Sie das eigentliche Problem, das Sie lösen wollen: Was sind "Pipelines, die leider keine Daten von stdin direkt akzeptieren"? dirkt vor 5 Jahren 0

1 Antwort auf die Frage

1
harrymc

Dieser Beitrag scheint auf Ihr Problem zu beziehen: Cat to Named Pipe führt zu Hang .

Die relevanten Bemerkungen sind:

  • Sie müssen etwas aus dem FIFO lesen
  • Stellen Sie sicher, dass die Pipe mit einem ausreichend großen Puffer erstellt wird oder die Leser schnell genug sind, um ein Blockieren zu vermeiden
  • Sie müssen die Pipe einem Dateideskriptor zuordnen, wie in:

    exec 3<>/tmp/stream_pipe 
Danke für die Information. Leider scheint das zu bedeuten, dass Named Pipes für mich keine Alternative sind, da das Poster auch besagt, dass der Versuch, die Puffergröße zu ändern, für ihn nichts geändert hat. Ich suchte nach einer Alternative zum Einstecken mit nachgeschalteten Tools, die nicht aus stdin lesen. Daher wird die Pipe nicht unbedingt beim Schreiben verbraucht. Es macht Sinn, dass Pfeifen sich so verhalten. Also zurück zum Schreiben und Lesen von intermediären physischen Temp-Files für mich ... jov14 vor 5 Jahren 0
Named Pipes sind nett, aber leider keine Lösung für möglicherweise sehr große Daten. harrymc vor 5 Jahren 0