• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Im Shellskript fifo auslesen

Wie lese ich in einem Shellskript ein fifo zeilenweise aus?
Konkret: Untenstehendes Skript brennt Daten in ein iso-Image. Die Ausgabe (stderr) von mkisofs möchte ich später in einen Fortschrittsbalken weiterverarbeiten. Dazu schreibe ich sie in die Pipe und lese sie zeilenweise mit head aus. Leider bricht bei der untenstehenden Konstruktion mkisofs mit "broken pipe" ab. Wenn ich statt des mkisofs eine Schleife mit einfachen echo- und sleep-Befehlen in das Skript schreibe, funktioniert alles. Was ist falsch?

Code:
#!/bin/sh

printfifo() {
  while [ -r fifofile ]; do
    LINE=`head -1 fifofile`
    echo LINE=$LINE
    sleep 0.5
  done
}

mkfifo fifofile

printfifo &
mkisofs -gui -graft-points -v -o image.iso $HOME/Dokumente/ > fifofile 2>&1
rm fifofile
sleep 3
 
A

Anonymous

Gast
StephanS schrieb:
Wie lese ich in einem Shellskript ein fifo zeilenweise aus?
Konkret: Untenstehendes Skript brennt Daten in ein iso-Image. Die Ausgabe (stderr) von mkisofs möchte ich später in einen Fortschrittsbalken weiterverarbeiten. Dazu schreibe ich sie in die Pipe und lese sie zeilenweise mit head aus. Leider bricht bei der untenstehenden Konstruktion mkisofs mit "broken pipe" ab. Wenn ich statt des mkisofs eine Schleife mit einfachen echo- und sleep-Befehlen in das Skript schreibe, funktioniert alles. Was ist falsch?

ohne das jetzt auszuprobieren
Code:
LINE=`head -1 fifofile`
Damit öffnest du die Pipe und ließt daraus, und dann schließt du sie wieder, Das schließen wird von der anderen Seite bemerkt und als brokenpipe signiert, worauf sich der schreibende Befehl auch verabschiedet.

schreibst du jetzt in einer Schleife
Code:
while true
do
 echo hallo > pipe
done
schreibst du nicht mit einem einzelnen Prozess sondern mit vielen vielen kleinen Prozessen. Ein echo schreibt und beendet sich in dem Moment wenn die Zeile auf der anderen Seite gelesen wird.
Danach kommt ein neues echo usw.

Wenn dein Prozess permanent schreibt, dann muss der Prozess auf der anderen Seite auch solange lesen bis ein EOF kommt und darf nicht Stückchenweise lesen und die Pipe dazwischen schließen.

robi
 
So ist es wohl. Ich hatte irgendwie gehofft, dass Ende des Leseprozesses den Schreibprozess nicht stört. Theoretisch könnte er ja noch weiter in die FIFO-Datei schreiben. Dann muss ich das vielleicht in Perl umschreiben.
 
A

Anonymous

Gast
StephanS schrieb:
Dann muss ich das vielleicht in Perl umschreiben.
geht auf der Bashebene genauso, du musst nur mit einem Prozess lesen und nicht Häppchenweise,

Code:
mkfifo fifofile

#Leseprozess
while read ZEILE
do
    echo "$ZEILE"
    sleep 1
done < fifofile &

JOB=$!
echo "Leseprozess hat PID $JOB"

#Schreibprozess
cat /etc/fstab >> fifofile

#Aufräumen
sleep 30
if ps -P $JOB >/dev/null 2>&1
then
  kill $JOB
  echo "der Lesejob wurde gekillt"
else
  echo "der Lesejob hat sich automatisch beendet"
fi

rm fifofile

Zum Vergleich setzt mal deine Leseschleife da rein. ;)

robi
 
Oben