!["exit 0" 명령을 사용해도 awk가 종료되지 않습니다.](https://linux55.com/image/144753/%22exit%200%22%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%B4%EB%8F%84%20awk%EA%B0%80%20%EC%A2%85%EB%A3%8C%EB%90%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
다음 명령이 있습니다.
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일 뿐입니다.
분명히 "&"를 사용하여 해당 명령을 백그라운드에 두고 다른 작업을 실행하는 것은 좋은 생각이 아닙니다. 해당 명령도 함께 종료됩니다!