2016-11-21 14 views
1

Вот интересная тайна ...
Этот код ...SHUF генерирует «Плохой дескриптор файла» ошибка NFS, но только тогда, когда запускается как фоновый процесс

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 

генерирует эту ошибку ...

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 

, но только когда я запускаю его в качестве фонового задания, как так ...

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

Когда я запускаю его непосредственно в интерактивной оболочке, он работает нормально.

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

Я предполагаю, что это что-то делать с тем фактом, что оба входных и выходные файлы проживают на акции Nfs дальше различного AWS EC2 инстанции.

Отказ от stdin, stderr и stdin в фоновом процессе является подозрительным. Это делается для того, чтобы процесс не погиб, если сеанс терминала закрыт. У меня есть много других команд, которые читают и пишут из этой части без каких-либо проблем. Только команда shuf сложна.

Мне любопытно, что может быть причиной этого, и если оно может быть исправлено без поиска альтернативы шуфу?

Я использую shuf (GNU coreutils) 8.21 на 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: устранение разъединяя из STDIN делает проблему уйти

то есть. если вместо того, чтобы делать это ...

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

Я делаю это ...

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

ошибка "Bad дескриптор" уходит.

Тем не менее, разделение stdin/stdout/stderr на то, чтобы убить сеанс терминала, не приведет к уничтожению процесса, поэтому это решение не совсем удовлетворительное.

Кроме того, кажется, что это необходимо только для shuf. Ни одна из других команд, которые читают файлы из этой файловой системы, не вызывает никаких ошибок.

ответ

0

Это оказалось ошибкой в ​​glibc.
Подробности здесь:
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=25029

Работа вокруг проста:
вместо

shuf $TRAINING_UNSHUFFLED > $TRAINING_SHUFFLED 

сделать

shuf < $TRAINING_UNSHUFFLED > $TRAINING_SHUFFLED 

Благодаря Padraig Брэди в команде Coreutils.

 Смежные вопросы

  • Нет связанных вопросов^_^