シェルスクリプト マルチスレッドっぽくバックグラウンド処理を同期させる

  1. コマンドの最後に & を付けて、バックグラウンド処理へまわす
  2. $! で直前のバックグラウンド処理の pid を取得して変数へ保持
  3. wait $hoe で指定した pid の処理の終了を待つ

バックグラウンド処理はおなじみ hoe & で出来る。

この pid を取るには、直後で $! にアクセスすることで参照できる。

wait コマンドは、指定した pid のプロセスが終了するまで待ってくれる。

サンプル

#!/bin/sh
echo "[info] run multiple background proc."
echo "[info] -----------------------------"
_dummy_proc(){
  sleep $1
  ret=`expr $1 % 2`
  exit $ret
}

_dummy_proc 2 &
pid1=$!
_dummy_proc 3 &
pid2=$!
_dummy_proc 5 &
pid3=$!

echo "[info] pid1=$pid1, pid2=$pid2, pid3=$pid3"

wait $pid1
sc=$?
if [ 0 -ne $sc ]; then
  echo "[error] pid1=$pid1 finished with status code $sc"
  kill -KILL $pid2
  kill -KILL $pid3
  exit 1
else
  echo "[info] pid1=$pid1 finished"
fi

wait $pid2
sc=$?
if [ 0 -ne $sc ]; then
  echo "[error] pid2=$pid2 finished with status code $sc"
  kill -KILL $pid3
  exit 1
else
  echo "[info] pid2=$pid2 finished"
fi

wait $pid3
sc=$?
if [ 0 -ne $sc ]; then
  echo "[error] pid3=$pid3 finished with status code $sc"
  exit 1
else
  echo "[info] pid3=$pid3 finished"
fi

echo "[info] -----------------------------"
echo "[info] finished all background proc."
exit 0

マルチスレッドっぽい?

シェアする

  • このエントリーをはてなブックマークに追加

フォローする