docker-compose.yaml에서 "$${!} 대기"는 무엇을 의미합니까?

docker-compose.yaml에서 "$${!} 대기"는 무엇을 의미합니까?

LetsEncrypt와 nginx를 사용하여 Docker 작업을 수행하고 있습니다. 다음 튜토리얼에는 12시간마다 인증서의 유효성을 확인할 수 있는 certbot 컨테이너에 대한 명령이 있습니다.

/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'

나는 한동안 bash를 해왔지만 wait $${!}이런 것을 본 적이 없습니까? 무슨 $${!}뜻인가요?

편집하다: 이 명령은 docker-compose.yaml의 일부이므로 전체 명령은 다음과 같습니다.

entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

답변1

사용된 YAML 파일에서 docker-compose단일 리터럴은 $로 작성되어야 합니다 $$. 명령을 실행할 때 이중 달러 기호는 단일 달러 기호로 바뀌므로 $셸 명령은 가장 최근에 시작된 백그라운드 작업과 ${!}동일한 프로세스 ID를 사용하게 됩니다.$!

구문 은 다음 $$과 같습니다여기에 녹음하세요:

$$구성에 리터럴 달러 기호가 필요한 경우 (이중 달러 기호)를 사용할 수 있습니다. 또한 이는 Compose가 값을 보간하는 것을 방지하므로 $$Compose에서 처리하지 않으려는 환경 변수를 참조할 수 있습니다.

이것은 실제로 bash. 이는 Compose가 YAML 문서를 처리하는 방법에 관한 것입니다.


백그라운드 작업 사용은 wait전혀 필요하지 않습니다. 대안적이고 동등한 명령은 다음과 같습니다.

/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h; done;'

waitsleep명령 내에서 실행되는 백그라운드 작업( )을 제외하고는 실제로 아무 일도 발생하지 않으므로 이는 원래 명령과 동일한 효과를 갖습니다 .

답변2

  • 이 변수에는 $!방금 실행한 프로세스의 프로세스 ID(PID)가 포함되어 있습니다.
  • wait $!프로세스가 완료될 때까지 기다리십시오.
  • sleep 12h &sleep 12h백그라운드에서 실행됩니다.

따라서 이 셸 스크립트는 백그라운드에서 절전 모드를 실행하고 완료될 때까지 기다립니다.

$!포그라운드에서 절전 모드가 실행되지 않는 이유와 변수 이름이 왜 그렇게 이상하게 작성되었는지 잘 모르겠습니다.

관련 정보