이 매우 간단한 Bash 스크립트 쌍은 AlmaLinux 8.6에서 예상한 대로 작동하지 않습니다.
첫 번째 스크립트는 Unix 소켓 앞에서 사전/사후 처리를 수행하는 간단한 게이트웨이 역할을 합니다. 또한 로깅을 위한 두 번째 스크립트를 호출합니다. 명령 기록 실패로 인해 게이트웨이 기능 구현이 중단되어서는 안 됩니다. (아래 표시된 스크립트는 문제를 강조하기 위해 설계된 버전이며 실제 스크립트는 더 복잡합니다.)
첫 번째 스크립트의 문제점은 해당 ... || true
구성을 사용함에도 불구하고 로깅 명령의 오류가 무시되지 않고 전체 스크립트가 실패하게 만든다는 것입니다. 왜 이런거야?
이 게이트웨이 서비스의 소비자는 다음과 같은 응답을 기대합니다.표준 출력및 일부 오류 메시지고양이어떻게든 채널에 들어간 것 같습니다. 로깅 실패 시 실패하는 것은 아래 스크립트가 아닌 게이트웨이 사용자인 것으로 보입니다. 현재 문제가 무엇인지 파악하기 위해 추가 테스트를 수행하고 있습니다. 이 질문을 더 자세히 업데이트하겠습니다.
10월 22일 편집: 문제는 파이프 소비자에 대한 인터페이스에 있습니다. 아래 댓글을 참조하세요.
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
sock_file="/path/to/my.sock"
in_cmd="/path/to/my_in.sh"
out_cmd="/path/to/my_out.sh"
log_cmd="/path/to/my_log.sh" # See second script below
exec 3<&0
$log_cmd <&3 >/dev/null || true
exec 3<&-
exec $in_cmd | nc -U -N "$sock_file" | $out_cmd
두 번째 스크립트의 문제점은 아무것도 기록하지 않는다는 것입니다. 그걸로 얻을 줄 알았는데표준 입력위의 상위 스크립트에서 FD 3으로 설정하시겠습니까?
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
log_file="/tmp/in.log"
stdbuf -iL cat >>"$log_file"
또한 - 이것은 실제 경험과 모순되는 것처럼 보이는 경고 메시지를 해석하려고 시도하는 문제에 가깝습니다.고양이통과하다표준 버퍼위에서 언급했듯이 계속해서표준 에러"stdbuf: 라인 버퍼링 stdin은 의미가 없습니다". 그러나 내가 입력하면고양이버퍼링 없음, 사용 stdbuf -i0 ...
여부표준 버퍼어쨌든 스크립트는 "cat: -: 리소스를 일시적으로 사용할 수 없습니다.".그래서 라인 버퍼링인 것 같아요.표준 입력무의미한가요, 아니면 뭔가 빠졌나요?