grep을 사용하여 출력을 필터링하기 위해 exec 및 파이프를 사용하여 쉘 스크립트에서 신호를 처리합니다.

grep을 사용하여 출력을 필터링하기 위해 exec 및 파이프를 사용하여 쉘 스크립트에서 신호를 처리합니다.

시작 시 쓸모없는 메시지를 많이 출력하는 컨테이너화된 애플리케이션을 배포 중입니다(동일한 메시지가 백만 번 정도 표시되고 아무 것도 변경되지 않음). 이 메시지는 응용 프로그램 구성을 통해 억제할 수 없으며 응용 프로그램 개발은 내 통제 범위를 벗어납니다. 이로 인해 로깅 인프라에 짜증나고 문제가 급증할 수 있습니다. 로깅 인프라의 메시지는 로그를 볼 때만 필터링할 수 있으며, 컨테이너 런타임에서 로깅 스토리지 백엔드로 로그를 전달할 때는 필터링할 수 없습니다.

따라서 내 의도는 foo bar baz애플리케이션 외부의 컨테이너 진입점 내부를 사용하여 이 메시지를 억제하는 것입니다(다음 예). grep지금까지 내가 시도한 것은 다음과 같습니다.

#!/bin/bash
set -euxo pipefail

exec myapp --some parameter | grep --line-buffered -v "foo bar baz"

그러나 이는 PID 1 을 대체하지 않으므로 myapp --some parameter신호가 SIGTERM올바른 프로세스로 전달되지 않습니다.

$> docker exec -it ep-test ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.0  18384  3008 pts/0    Ss+  16:54   0:00 /bin/bash /entrypoint
root         7  0.0  0.0   4540   836 pts/0    S+   16:54   0:00 myapp --some parameter
root         8  0.0  0.0  11472   964 pts/0    S+   16:54   0:00 grep --line-buffered -v "foo bar baz"
root         9  0.0  0.0  34412  2668 pts/1    Rs+  16:54   0:00 ps aux

exec로 줄이면 exec myapp --some parameterPID 1이 올바르게 대체됩니다(그러나 출력은 필요에 따라 필터링되지 않습니다).

$> docker exec -it ep-test ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.2  0.0   4540   768 pts/0    Ss+  16:55   0:00 myapp --some parameter
root         7  0.0  0.0  34412  2796 pts/1    Rs+  16:55   0:00 ps aux

애플리케이션을 깔끔하게 종료하려면 SIGTERM(및 기타 알려진 신호)를 에 전달하는 것이 중요합니다 myapp. 내가 아는 한, 이를 달성하는 가장 쉬운 방법은 PID 1을 exec.

myappgrep그래서 내 질문은 컨테이너로 전송된 신호가 로 전송/전달되는지 확인하면서 with 의 출력을 필터링하는 쉬운 방법이 있습니까 myapp?

답변1

일반 파이프를 사용하지 않도록 grep과 함께 bash 명명된 파이프(fifo)를 사용해 볼 수 있습니다. 이 구문은 >(cmd)fifo를 생성하고, cmdfifo를 표준 입력으로 실행하고, 명령줄에서 fifo의 이름을 대체하므로 /dev/fd/63앱 명령의 stdout을 해당 fifo로 보낼 수 있습니다 (예: ) >.

exec myapp --some parameter > >(grep --line-buffered -v "foo bar baz")

공백에 유의하십시오 > >().

관련 정보