2016-11-21 4 views
1

Hier laufen ist ein interessantes Geheimnis ...
Dieser Code ...shuf erzeugt „Bad Dateideskriptor“ Fehler auf nfs aber nur, wenn sie als Hintergrundprozess

shuf $TRAINING_UNSHUFFLED > $TRAINING_SHUFFLED 
wc -l $TRAINING_UNSHUFFLED 
wc -l $TRAINING_SHUFFLED 

shuf $VALIDATION_UNSHUFFLED > $VALIDATION_SHUFFLED 
wc -l $VALIDATION_UNSHUFFLED 
wc -l $VALIDATION_SHUFFLED 

diesen Fehler erzeugt ...

shuf: read error: Bad file descriptor 
8122 /nfs/digits/datasets/com-aosvapps-distracted-driving3/databases/TrainImagePathsAndLabels_AlpineTest1.csv 
0 /nfs/digits/datasets/com-aosvapps-distracted-driving3/databases/TrainImagePathsAndLabels_AlpineTest1_Shuffled.csv 

shuf: read error: Bad file descriptor 
882 /nfs/digits/datasets/com-aosvapps-distracted-driving3/databases/ValImagePathsAndLabels_AlpineTest1.csv 
0 /nfs/digits/datasets/com-aosvapps-distracted-driving3/databases/ValImagePathsAndLabels_AlpineTest1_Shuffled.csv 

aber nur, wenn ich es als Hintergrundjob laufen wie so ...

tf2$nohup ./shuffle.sh >> /tmp/shuffle.log 2>&1 0>&- & 
[1] 6897 

Wenn ich es direkt in einer interaktiven Shell starte, scheint es gut zu funktionieren.

tf2$./shuffle.sh > /tmp/shuffle.log 

Ich vermute, dass dies etwas mit der Tatsache zu tun hat, dass sowohl die Ein- und Ausgabedateien befinden sich auf einer NFS-Freigabe auf einer anderen aws EC2-Instanz.

Die Trennung von stdin, stderr und stdin im Hintergrund ist beispielsweise verdächtig. Dies geschieht, damit der Prozess nicht beendet wird, wenn die Terminalsitzung geschlossen wird. Ich habe viele andere Befehle, die von dieser Freigabe ohne Probleme überhaupt lesen und schreiben. Nur der Befehl shuf ist schwierig.

Ich bin neugierig, was könnte dies verursachen und wenn es reparierbar ist, ohne eine Alternative zu suchen, shuf?

Ich benutze Shuf (GNU Coreutils) 8.21 auf Ubuntu 14.04.5 LTS.

tf2$which shuf 
/usr/bin/shuf 

tf2$shuf --version 
shuf (GNU coreutils) 8.21 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Written by Paul Eggert. 

tf2$lsb_release -a 
No LSB modules are available. 
Distributor ID: Ubuntu 
Description: Ubuntu 14.04.5 LTS 
Release: 14.04 
Codename: trusty 

UPDATE: das Abtrennen von STDIN Beseitigung macht das Problem weggehen

dh. wenn statt, dies zu tun ...

$nohup ./shuffle.sh > /tmp/shuffle.log 2>&1 0>&- & 

ich dies tun ...

$nohup ./shuffle.sh > /tmp/shuffle.log 2>&1 & 

der "Bad Descriptor" Fehler weggeht.

Die Trennung von stdin/stdout/stderr ist jedoch da, um sicherzustellen, dass das Beenden der Terminalsitzung den Prozess nicht beendet, daher ist diese Lösung nicht vollständig zufriedenstellend.

Darüber hinaus scheint es nur notwendig zu sein, dies für shuf zu tun. Keiner der anderen Befehle, die Dateien aus diesem Dateisystem lesen, verursacht Fehler.

Antwort

0

Dies stellte sich als Fehler in glibc heraus.
Die Details sind hier:
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=25029

Die Behelfslösung einfach:
statt

von
shuf $TRAINING_UNSHUFFLED > $TRAINING_SHUFFLED 

tun

shuf < $TRAINING_UNSHUFFLED > $TRAINING_SHUFFLED 

Dank Pádraig Brady auf dem coreutils Team.

Verwandte Themen