Любопытный случай неисправной трубы
Может ли кто-нибудь предоставить мне какое-либо понимание возможных причин для следующей проблемы. Большую часть времени я могу бежать ( set -o pipefail; ldd --version | head -n 1; echo $? )
и получите следующее.
$ ( set -o pipefail; ldd --version | head -n 1; echo $? )
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
0
Но тогда случайным образом это начнет терпеть неудачу
$ ( set -o pipefail; ldd --version | head -n 1; echo $? )
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
141
Для чего стоит я видел это на Ubuntu 16.04 x86_64, а также на машине RHEL 7.3 ppc64le
1 ответ
141
является EINIT
, т.е. процесс был прерван.
Что происходит то head -1
закрывает свой входной поток после прочтения первой строки. когда ldd
пытается записать в закрытую трубу, с ошибкой EINIT
,
Обычно вы этого не видите - программы выходят с ошибкой после head
взял то, что хочет, но вы не видите исход ошибки. Но потому что ты set -o pipefail
вы видите ошибку.
Это периодически, потому что в канале есть буфер, а планирование непредсказуемо. Иногда ldd
закончил писать раньше head
закрывает трубу.
Вы можете последовательно увидеть сбой, если вы делаете ldd | echo
(потому что эхо сразу закрывает стандартный ввод), и вы можете последовательно видеть, что это успешно с ldd | cat
(так как cat
всегда потребляет до EOF).