쉘 스크립트는 닫힌 파일 설명자를 사용하여 발생하는 SIGPIPE를 어떻게 방지합니까?

쉘 스크립트는 닫힌 파일 설명자를 사용하여 발생하는 SIGPIPE를 어떻게 방지합니까?

반대쪽 끝이 사라지면 쉘 스크립트는 표준 및 기타 파일 설명자를 잃을 수 있습니다. 이런 일이 발생할 수 있는 한 가지 방법은 ssh스크립트를 시작하는 데 사용된 클라이언트를 종료하는 것입니다.

$ ssh localhost test
^C

그러면 bashSSH를 통해 호출되는 스크립트가 시작되고 a를 사용하여 명령이 종료됩니다. 이는 연속을 종료하지는 않지만 첨부된 파일 설명자(예: 표준 입력/출력/오류)를 닫습니다.testCtrlCsshtest

닫힌 파일 설명자를 사용 test하려고 하면 SIGPIPE.echo

표준 오류뿐만 아니라 systemd 로그에도 메시지를 기록하는 기능이 있을 test수 있습니다 . 이 같은:logecho

log() {
 echo "$*" | systemd-cat -t test
 echo >&2 "$*"
}

두 번째는 세션이 종료된 후 echoa()를 발생시킵니다 . 문제 없이 실행이 계속되도록 서브셸에 넣으면 이러한 일이 발생하는 것을 방지할 수 있습니다.SIGPIPEsshCtrlCechoecho

( echo >&2 "$*" )

하지만 더 좋은 방법이 있나요?

답변1

스크립트에서 SIGPIPE를 무시하려면 다음을 수행할 수 있습니다.

trap "" PIPE

관련 정보