깨진 파이프는 Jenkins에만 나타납니다.

깨진 파이프는 Jenkins에만 나타납니다.

로컬에서 잘 작동하는 스크립트가 있습니다. 하지만 Jenkins에서 실행하면 Error: writing output failed: Broken pipe.

제 질문은 Jenkins에서 작동하도록 이 문제를 해결하는 방법입니다.

이제 이 질문에 답하기 위해 상황을 활용해 보겠습니다. 실제 파이프라인은 somevar=$(jq --arg host "${HOSTNAME}" --arg id "${ID}"'.[] | select((.hostname==$host) and (.port==XXXX)).serviceId = $id' <<<"${MYJSON}" | jq -s).

젠킨스 버전 2.164.3

젠킨스 배쉬 버전 4.2

젠킨스 운영 체제 CentOS 7

로컬 배쉬 버전 5

기본 운영 체제 Arch 커널 버전 5.0

또한 다음 사양을 갖춘 Docker 컨테이너에서 이 스크립트를 성공적으로 실행했습니다.

컨테이너 운영 체제 Ubuntu 18.04

배쉬 4.4

따라서 내 질문에 답할 수 없다면 이것이 다른 환경에서는 작동하지만 Jenkins에서는 작동하지 않는 이유를 설명할 수 있습니다. 아니면 이 문제에 대한 해결책을 제안해 주실 수 있나요? 현재 trap더 많은 정보를 얻기 위해 사용을 고려하고 있습니까 ? 하지만 어떻게 할 수 있는지 잘 모르겠습니다.

답변1

스크립트를 호출하는 프로그램을 찾고 SIGPIPE신호 처리기를 무시하도록 설정하십시오. (찾기 trap '' PIPE등). 신호의 "무시" 처리는 하위 프로세스에 상속됩니다.

유사한 파이프에서는 ... | head -5파이프의 왼쪽이 깨끗하고 조용하게 빠져나가는 것이 SIGPIPE절대적으로 정상입니다 . 무시되거나 포착되면 SIGPIPE시스템 write()호출은 오류를 반환 EPIPE하거나 "깨진 파이프"로 번역됩니다.

많은 형편없는 프로그램은 a가 성공했는지 확인하지 않습니다 write(). 즉, SIGPIPEsetuid 실행 파일을 호출할 때 무시하도록 설정하는 것이 공격 경로가 될 수 있습니다.

하지만 그렇지 않습니다. jq예상치 못한 상황이 발생하면 즉시 알려줍니다(출력에는 차이가 없을 가능성이 높습니다).

하지만 저는 Jenkins를 사용하지도 좋아하지도 않기 때문에 더 이상 도움을 드릴 수 없습니다. 나는 이것이 Jenkins의 잘못인지 매우 의심합니다.

관련 정보