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
バックグラウンドで実行されます。
したがって、このシェルスクリプトはバックグラウンドでスリープモードを実行し、完了するのを待ちます。
$!
フォアグラウンドでスリープモードが実行されない理由と、変数名がなぜそんなに奇妙に書かれているのかわかりません。