mariadbテストコンテナの開始を決定するスクリプトを作成しようとしています。port: 3306
は最後の行です。その後、多くのことは予想されません(したがって、SIGPIPEに頼るのではなくプロセスをpodman logs -f
終了してみてください)。podman logs
set -x -v; \
podman run -d --name mdb_test -P -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 mariadb:10.6 ; \
podman logs -f mdb_test 2>&1 | grep -m1 'port: 3306' & \
pid_grep=$! ; \
pid_podman_logs=$(jobs -p); \
jobs; \
wait $pid_grep; \
kill $pid_podman_logs; \
port=$(podman port mdb_test 3306); \
mysql -u root --protocol tcp --port ${port#*:} -e 'select version()';
出力:
+ set -x -v
+ podman run -d --name mdb_test -P -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 mariadb:10.6
299b645a84b278d2ffcfb776bf12cf282a0695131bf77a02f0c7701a9ea1868b
[1]+ Done podman logs -f mdb_test 2>&1 | grep -m1 'port: 3306'
[1] 2414801
+ pid_grep=2414801
+ podman logs -f mdb_test
+ grep -m1 'port: 3306'
++ jobs -p
+ pid_podman_logs=2414800
+ jobs
[1]+ Running podman logs -f mdb_test 2>&1 | grep -m1 'port: 3306' &
+ wait 2414801
Version: '10.6.1-MariaDB-1:10.6.1+maria~focal' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
シェルが終了し(まだ実行中wait
であるにもかかわらず)、なぜ停止して進行しないのか疑問に思います。grep
podman logs
他のスクリプトの改善も歓迎します。
より簡単なバージョン編集:
set -x -v ; (echo "bob"; sleep 100000) | grep -m1 bob & pid_grep=$!; pid_echo=$(jobs -p); jobs ; wait $pid_grep; kill $pid_echo; echo ready
+ set -x -v
[1] 2417616
+ pid_grep=2417616
+ grep -m1 bob
+ echo bob
+ sleep 100000
++ jobs -p
+ pid_echo=2417615
+ jobs
[1]+ Running ( echo "bob"; sleep 100000 ) | grep -m1 bob &
+ wait 2417616
bob
他のシェルでpsをチェックするとgrepが完了しました。
ベストアンサー1
IMO、あなたが進む方法は完全に間違っています。
プロセスがポートでリッスンして正しく応答することを確認する正しい方法は、ポートに接続してクエリすることです。 grepログの最良の効果は、今実際に聞いているのではなく、過去のある時点で聞いていたことを知らせることです。ログエントリと今の間にある時点で死んでいる可能性があります。
したがって、mysqlを起動し、whileループを使用してmysqlが正しく応答していることを確認してください。ループが繰り返されるたびに、数秒間休止状態を維持します。
スクリプト全体を次のように置き換えることができます。バックグラウンドジョブ、スタンバイ、PID終了などは不要です。
podman run -d --name mdb_test -P -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 mariadb:10.6
# I'm not sure why you need to do this rather than just 'port=3306', but I don't
# know podman. Maybe it's necessary for some kind of namespace port mapping.
port=$(podman port mdb_test 3306)
port=${port#*:}
MYSQL_VERSION=""
while [[ ! "$MYSQL_VERSION" =~ ^Version ]] ; do
sleep 2
MYSQL_VERSION=$(mysql -u root --protocol tcp --port "$port" -e 'select version()')
done
echo "$MYSQL_VERSION"