Domanda

Questo è strano e non sono sicuro di chi sia veramente il colpevole.

Sto eseguendo alcuni script, su FreeBSD (6.2)?che fa ampio uso del seguente ***bash***ismo:

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

...dove "fai_qualcosa è un'utilità un po' complicata (in Perl) che non legge da una pipeline.Se uso un file normale funziona bene.Mio bash script usando cose come exec 4< <(...) con questo tipo di query (seguite da cicli del modulo while read x y z <&4; do ... non sembrano mai avere problemi.

Tuttavia, Perl (5.8.x) sembra bloccarsi periodicamente (apparentemente per sempre).Ho provato a cambiare il chomp(my $data = <MYDATA>); con una routine che utilizzava sysread e ho scritto alcuni casi di test in Python per il confronto.Questi sembrano bloccarsi molto meno spesso del codice Perl idiomatico, ma a volte lo fanno comunque.(Il codice Python utilizzando f.read() O os.read(f.fileno()...) sembra comportarsi allo stesso modo in questo numero).

Ho provato a riprodurre il problema utilizzando ... <(cat ...) (dove sono gattoing il file normale) e che non sembra mai riprodurre quello stallo.

Ne ho dato un'occhiata ad alcuni ktrace/kdump dati ...ma ho molta più familiarità con Linux strace o anche Solaris capriata ...quindi non ho ancora capito nemmeno cosa sta succedendo da lì.

Suppongo che possiamo escludere per lo più Perl, perché ho riprodotto lo stesso problema usando Python...Non vedo come il bash potrebbe fare qualcosa di sbagliato qui (sta semplicemente creando una pipe con nome in /var/tmp/sh-np-xxx e collegare i processi fino a questo).

Cosa potrebbe mysql shell/utility sta facendo ciò potrebbe causare questo?Non credo di averlo visto da nient'altro (come gatto O gg).Non ho testato questo scenario sotto Linux...ma ho usato <(...) (sostituzione del processo) per anni sotto Linux e non ricordo di averlo mai visto.

È un problema di FreeBSD?

Certo, posso risolvere il problema utilizzando file temporanei...ma di sicuro preferirei capire perché lo fa (ed evitare alcune delle gare e il disordine di pulizia che i file temporanei comportano).

Eventuali suggerimenti?

È stato utile?

Soluzione

La grande differenza tra operare sull'output di mysql e direttamente su un file è la tempistica.Quando il processo Perl è in stallo, la grande domanda è:"perché non fa progressi"?Puoi usare l'opzione "l" di ps per vedere il canale di attesa per il processo perl;in questo modo puoi vedere se è bloccato durante una lettura o se sta succedendo qualcos'altro.Se è veramente bloccato sull'input del pipe, mi aspetto che la voce MWCHAN per perl sia "piperd".

Le stesse informazioni sarebbero interessanti per il processo mysql.

Che aspetto ha il tuo codice di test Python?

Un altro modo di scrivere questo evitando il bashismo è questo;questo ti permetterebbe di escludere bash:

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

Altre domande interessanti:

  • L'opzione --unbuffered di mysql cambia qualcosa?

  • Il convogliamento dell'output mysql tramite dd cambia qualcosa?(per esempio."perlscript <(mysql...| DD)

Riepilogo:Hai bisogno di maggiori informazioni

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top