Любопытный случай неисправной трубы

Может ли кто-нибудь предоставить мне какое-либо понимание возможных причин для следующей проблемы. Большую часть времени я могу бежать ( 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).

Другие вопросы по тегам