Frage

Das ist seltsam, und ich bin nicht sicher, wer der Täter wirklich ist.

Ich mache einige scripting, auf FreeBSD (6.2)? die machen ausgiebig Gebrauch von der folgenden *** bash *** ism:

do_something <(mysql --skip-column-names -B -e 'select ... from ... where ...;')

... wobei „do_something ist ein etwas crufty-Dienstprogramm (in Perl), die nicht aus einer Pipeline gelesen wird. Wenn ich eine normale Datei verwende es funktioniert gut. Meine bash Skript Dinge wie exec 4< <(...) mit dieser Art von Abfragen (gefolgt von Schleifen der Form while read x y z <&4; do ... scheinen nie irgendwelche Probleme zu haben.

Allerdings Perl (5.8.x) scheint in regelmäßigen Abständen zu blockieren (scheinbar für immer). Ich habe versucht, die chomp(my $data = <MYDATA>); mit einer Routine Wechsel aus, die verwendet sysread und ich zum Vergleich einige Testfälle in Python geschrieben. Diese scheinen weit weniger häufig als die idiomatische Perl-Code zu blockieren, aber sie tun es immer noch manchmal. (Der Python-Code mit f.read() oder os.read(f.fileno()...) scheint in dieser Frage etwa gleich zu verhalten).

Ich habe versucht, das Problem mit ... <(cat ...) reproduzieren (wo ich Katze ing die reguläre Datei) und das scheint nie das Stall zu reproduzieren.

Ich habe irgend ktrace / kdump blickt Daten ... aber ich bin weit besser vertraut mit Linux strace oder auch Solaris Truss ... so habe ich nicht herausgefunden, was noch von dort los ist, auch nicht.

Ich denke, wir können meist Perl ausschließen, weil ich das gleiche Problem mit Python wiedergegeben habe ... Ich sehe nicht, wie die bash könnte hier etwas zu tun, falsch sein (es nur ist die Schaffung eine Named Pipe in / var / tmp / sh-np-xxx und Verdrahtung die Prozesse bis zu diesem).

Was könnte das mysql Shell / Dienstprogramm, das könnte dazu führen, dies tun? Ich glaube nicht, dass ich es von alles andere gesehen habe (wie Katze oder dd ). Ich habe nicht dieses Szenario unter Linux getestet ... aber ich habe <(...) (Prozess Substitution) seit Jahren unter Linux verwendet und kann mich nicht erinnern jemals zu sehen.

Ist es ein FreeBSD Problem?

Sicher kann ich das Problem umgehen, temporäre Dateien verwenden ... aber ich würde sicher nicht verstehen, warum es dies zu tun (und einige der Rassen und clean-up Unübersichtlichkeit zu vermeiden, dass temporäre Dateien zur Folge hat).

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Der große Unterschied auf der Ausgabe von mysql zwischen Betrieb und direkt auf einer Datei ist das Timing. Wenn der Perl-Prozess ins Stocken geraten ist, ist die große Frage: „Warum ist es nicht vorwärts Fortschritte machen“? Sie können die „l“ Option ps verwenden, um den Wartekanal für den Perl-Prozess zu sehen; auf diese Weise können Sie sehen, wenn sie auf einer Lese blockiert, oder wenn etwas anderes passiert. Wenn es wirklich auf Pipeeingabe blockiert ist, ich erwarte, dass der MWCHAN Eintrag für Perl sein „piperd“.

Die gleiche Information wäre für den MySQL-Prozess interessant sein.

Wie sieht Ihre Python-Test-Code aussehen?

Eine andere Möglichkeit, dies zu schreiben, während die bashism vermeiden, ist dies; dass Sie erlauben würde, bash auszuschließen:

mysql --skip-column-names -B -e 'select ... from ... where ...;' | do_something /dev/stdin

Weitere interessante Fragen:

  • Hat die --unbuffered Option mysql etwas ändern?

  • Hat kochend die mysql Ausgabe durch dd etwas ändern? (ZB „Perlscript <(mysql ... |. Dd)

Zusammenfassung:. Sie benötigen weitere Informationen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top