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;'
wait
sleep
명령 내에서 실행되는 백그라운드 작업( )을 제외하고는 실제로 아무 일도 발생하지 않으므로 이는 원래 명령과 동일한 효과를 갖습니다 .
답변2
- 이 변수에는
$!
방금 실행한 프로세스의 프로세스 ID(PID)가 포함되어 있습니다. wait $!
프로세스가 완료될 때까지 기다리십시오.sleep 12h &
sleep 12h
백그라운드에서 실행됩니다.
따라서 이 셸 스크립트는 백그라운드에서 절전 모드를 실행하고 완료될 때까지 기다립니다.
$!
포그라운드에서 절전 모드가 실행되지 않는 이유와 변수 이름이 왜 그렇게 이상하게 작성되었는지 잘 모르겠습니다.