Неожиданная ошибка прерванной трубы в конвейере оболочки внутри терминала Jupyter Notebook - PullRequest
0 голосов
/ 14 апреля 2020

Я столкнулся с ls: write error: Broken pipe при запуске ls -l | head в каталоге, содержащем слишком много файлов. Я не сталкивался с этой проблемой при запуске ls | head. Мне просто интересно, почему опция -l может вызвать эту проблему. Также я хотел бы знать, как решить эту проблему, но по-прежнему с подробной информацией о напечатанных файлах.

Чтобы воспроизвести мою проблему, вы можете сначала открыть терминал в , предоставленный Jupyter Notebook ,

enter image description here

и затем выполните следующие коды.

cd
mkdir test
cd test
for i in {1..200}; do touch $i; done
ls -l | head

Вывод выглядит следующим образом.

total 0
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 1
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 10
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 100
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 101
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 102
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 103
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 104
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 105
-rw-rw-r-- 1 s1855106 s1855106 0 Apr 14 10:14 106
ls: write error: Broken pipe

1 Ответ

0 голосов
/ 14 апреля 2020

Python (по крайней мере, более старые версии python2) не сбрасывает обработку SIGPIPE для подпроцессов

Это означает, что любые команды, запущенные им (например, команды, которые вы запускаете в блокнот Jupyter) будет игнорировать SIGPIPE, точно так же, как если бы вы выпустили trap '' PIPE. Это, в свою очередь, означает, что команды в конвейере не перехватывают SIGPIPE, который отправляется им при попытке записи в их stdout, в то время как следующая команда (tail, в вашем случае) в конвейере закончил, и, таким образом, вместо этого появляется ошибка записи. См., Например, этот отчет об ошибке .

(trap '' PIPE; ls -l | head) надежно воспроизведет вашу проблему в любой (не Jupyter) оболочке.

Очевидно, python3 исправил это , поэтому вы можете попробовать изменить python версию , используемую вашим ноутбуком. В качестве альтернативы, вы можете попробовать "игнорировать" SIGPIPE, введя trap - PIPE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...