그래서 자동화 스크립트 중 일부에서 SSH 연결이 중단된 채로 남아 있는 이유가 궁금합니다. 그리고 이상한 문제에 직면하게 됩니다. SSH는 PTY 없이 사용되는 경우 출력 파이프가 닫힐 때 종료되지 않습니다. . 이것은 여기의 다른 여러 질문에서 논의되었지만 적용되는 답변을 찾지 못했습니다. 일부는 -t
옵션 사용을 제안했지만 PTY가 필요하고 파이프가 작동하지 않습니다.
어쨌든 문제를 다음과 같은 최소한의 예로 축소했습니다.
#this works
cat /dev/zero |false
#this never terminates
ssh user@host "cat /dev/zero" |false
SSH가 SIGPIPE가 데드 파이프(오류를 일으키는 파이프)에 쓰지 못하도록 무시하는 이유나 이를 올바르게 "작동"시키는 방법에 대한 설명이 있습니까?
SIGPIPE를 원격 호스트에 "릴레이"할 필요는 없습니다. 간단히 ssh 클라이언트를 종료하면(SIGPIPE가 무시되지 않을 때 발생하는 현상) 결과는 동일하지만 복잡성이 덜하고 일부 "더 정확합니다" " 가정.
당신의 생각에 감사드립니다!
-mk
편집하다: Sun_SSH 서버에서만 발생하며 문서화되지 않은 문제인 것 같습니다. 좋은 해결책을 찾고 있어요.
답변1
내 질문에 대답하려면: 이것은 Sun SSH의 알려진 문제입니다. 내가 찾은 가장 좋은 해결 방법은 출력에서 "Sun_SSH"를 감지 ssh -V
하고 다음과 같이 적용하는 것입니다.
#!/bin/bash
# ....
( ssh host 'localCommand' | remoteCommand || pkill -P $BASHPID )
다른 쉘이나 더 간단한 상황 (쉘에 다른 하위 프로세스가 없는 경우) 에서 $$
대신 사용할 수도 있습니다.$BASHPID