"exit 0" 명령을 사용해도 awk가 종료되지 않습니다.

"exit 0" 명령을 사용해도 awk가 종료되지 않습니다.

다음 명령이 있습니다.

sudo docker logs -f <id> | awk '/Listening on / {print $3; exit 0;}'

내가 이해한 바에 따르면 awk는 패턴과 일치하는 첫 번째 줄을 찾고 올바른 열을 인쇄한 다음 종료됩니다. 그러나 이것이 항상 발생하는 것은 아닙니다. 대부분의 경우 올바른 열을 인쇄하고 정지하지만 가끔 올바르게 종료되는 경우도 있습니다.

나는 노력했다

$ sudo stdbuf -i0 -o0 -e0 docker logs ...  # hangs
$ sudo docker logs ... | cat | awk ... # hangs

mkfifo최소한의 예제를 생성하려고 시도하면서 , 을 사용하여 파이프를 만들어 보았지만 cat foo | awk ...멈추지 않았습니다.

의 출력은 docker logs -f <id>다음과 같습니다

Listening on 172.17.0.2/16
...

그런 다음 열린 상태로 유지되지만 다른 내용은 쓰지 않습니다.

무슨 일인지 이해가 안 되네요. 혹시 아이디어 있으신 분 계신가요?

답변1

에서 man bash:

셸은 값을 반환하기 전에 파이프라인의 모든 명령이 종료될 때까지 기다립니다.

도커가 설치되어 있지 않지만 다음을 시도해 보십시오.

awk '/Listening on / {print $3; exit 0;}' <( sudo docker logs -f <id> )

또는 다음을 시도해 볼 수 있습니다.

sudo docker logs -f <id> | (awk '/Listening on / {print $3; exit 0;}'; pkill -P $$ )

따라서 무슨 일이 일어나고 있는지에 대한 설명이 도움이 될 것입니다. 나는 "docker log" 명령이 정상적으로 종료되지 않는다고 가정합니다(-f == 다음?).

초기 문제는 awk가 종료될 때 파이프가 종료되지 않았기 때문에 발생했습니다. 이는 파이프가 여전히 docker 프로그램을 기다리고 있었기 때문입니다(위에서 발췌한 bash 매뉴얼 페이지 참조).

pkill은 부모 ID가 $$인 모든 것을 죽입니다. 즉, 그 순간에는 단지 docker일 뿐입니다.

분명히 "&"를 사용하여 해당 명령을 백그라운드에 두고 다른 작업을 실행하는 것은 좋은 생각이 아닙니다. 해당 명령도 함께 종료됩니다!

관련 정보