
10-03-2006
|
|
Registreret Bruger
|
|
|
Join Date: Sep 2006
Beliggenhed: Sverige
Stillinger: 59
|
|
|
Fejlfinding: file læsning sammenstød?
Hej alle
Jeg forsøger at fuldt ud forstå et spørgsmål, jeg havde i går og var bare håber du gerne give mig din mening om det. Jeg tror, jeg løst problemet, men jeg føler stadig uvidende om nogle dele af den adfærd, jeg kunne opleve i følgende scenario. Her var situationen (gamle forenklet kode version):
Code:
for FILE in $INPUT_DIR ; do
grep -q $FILE $PROCESSED 2>&1
if [ $? != 0 ] ; then
echo $FILE >> $PROCESSED
else
continue
fi
SOURCE=`grep ^S $FILE | wc -l | awk '{print $1}'`
END_RCD=`grep ^E $FILE | wc -l | awk '{print $1}'`
if [ $SOURCE -ne $END_RCD ] ; then
echo "Error in $FILE: "$SOURCE" source keys detected, but "$END_RCD" end keys detected.
fi
done
Indholdet af INPUT_DIR indeholdt en masse filer, og det rapporteres ovenstående fejl på en af dem (SOURCE \u003d 1, END_RCD \u003d 0). Men filen var ok så vidt jeg kunne se. Jeg hurtigt sikres mine kommandoer var korrekte, og selv igen kørte scriptet på hele filliste for at få en endelig ok som et output, så det så mærkeligt ved første øjekast.
Efter nogen tid på undersøgelsen jeg endelig fundet, at jeg havde en masse n processer, der kører i baggrunden, kræver, at bit kode. På trods af dette jeg oprindeligt meningen dette script ville kun kører en gang på samme tid, så de filer forarbejdede min processen (n) der falder ind under INPUT_DIR ville være at ajourføre FORARBEJDEDE fil, så de ikke bliver opfanget af det næste opkald.
Desværre for min teori, sandheden var, at manuskriptet fik kaldte flere gange på samme tid (fra forskellige sessioner), behandling parallelt, dette med en FORARBEJDEDE fil, der ikke var entydig (du begynde at se, hvad det kan se ud her ). Så for at opsummere, ovenstående script rapporteret en fejl, når du kører på processen (n) i en fil, som oprettes af processen (n-1).
Nu ovenstående situation bør stadig være ok, så længe en fil åbnes, når et tidspunkt, det er bare at denne fil bliver kontrolleret af den forkerte proces, men resultatet er det samme. Så hvad jeg mener er, at den fil, som den rapporterede fejlen blev åbnet i to sessioner på samme tid.
Jeg har fjernet FORARBEJDEDE fil og nu køre dette script gang, efter at alle processer er afsluttet, så jeg får ikke noget problem længere. Det eneste, jeg stadig ikke forstår, er hvorfor END_RCD gav 0. Da to sessioner har forskellige variable buffere, jeg kan ikke se, hvordan en potentiel sammenstød på en fil vil give sådan en fejl. Hvis nogen her har en troværdig forklaring, ville jeg være meget glad for at vide om det.
Mange tak,
Yann
|