Wir haben eine Änderung bei Named Pipes nach einem Linux-Kernel-Upgrade festgestellt. Mit den Skripten vonhttp://www.linuxjournal.com/content/using-named-pipes-fifos-bashkonnten wir das Problem reproduzieren. Die Skripte funktionieren auf
Linux TEST05 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
aber warte
Linux TEST01 3.13.0-65-generic #106-Ubuntu SMP Fri Oct 2 22:08:27 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Es scheint einen Unterschied in der Funktionsweise benannter Pipes zu geben. Ist das beabsichtigt oder nicht?
Wir haben die beiden Skripte als pipe_reader.sh erfasst:
#!/bin/bash
pipe=/tmp/testpipe
trap "rm -f $pipe" EXIT
if [[ ! -p $pipe ]]; then
mkfifo $pipe
fi
while true
do
if read line <$pipe; then
if [[ "$line" == 'quit' ]]; then
break
fi
echo $line
fi
done
echo "Reader exiting"
und pipe_writer.sh:
#!/bin/bash
pipe=/tmp/testpipe
if [[ ! -p $pipe ]]; then
echo "Reader not running"
exit 1
fi
if [[ "$1" ]]; then
echo "$1" >$pipe
else
echo "Hello from $$" >$pipe
fi
Gibt es eine Lösung?
BEARBEITEN:
Wir führen jedes Skript in seinem eigenen Terminal aus. Sie bleiben in dem Sinne hängen, dass das Schreibskript nie existiert und das Leseskript nie die normale Ausgabe „Hallo von ...“ anzeigt. Wir führen sie unter beiden Kernelversionen auf identische Weise aus, es gibt also kein Problem, ein Skript mehr als einmal auszuführen, oder andere Verfahrensunterschiede.
Antwort1
Mein Ruf ist nicht gut genug, um einen Kommentar zu verfassen, also schreibe ich eine Antwort.
Was meinst du mit „hängen bleiben“? Was passiert, wenn du es ausführst pipe_reader.sh
und pipe_writer.sh
in einem anderen Terminal?
Und was bewirkt der Befehl nach der Ausführung beider Skripte:
ls -al /proc/$(pgrep pipe_reader.sh)/fd
zeigen?
Vielleicht haben Sie mehrere .pipe_reader-Skripte ausgeführt, sodass nur das erste die Pipe_Writer-Ausgabe erhält? Stellen Sie sicher, dass
ps aux | grep pipe_reader | grep -v grep | wc -l
gibt 1 zurück
Antwort2
So wie ich es verstehe, handelt es sich bei 3.13.0-55 und 3.13.0-65 um denselben Kernel (3.13) mit einigen Fixes/Patches des Distributionsanbieters. Es ist unwahrscheinlich, dass die Pipe-Funktionalität mit diesem Upgrade geändert wird. Ich glaube, dass Kernel-Entwickler es missbilligen würden, wenn diese Funktionalität nicht funktioniert.
Da ist noch etwas anderes los.