bashスタンバイプロセスは、プロセスが終了した後も停止します。

bashスタンバイプロセスは、プロセスが終了した後も停止します。

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であるにもかかわらず)、なぜ停止して進行しないのか疑問に思います。greppodman 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"

おすすめ記事