Lから始まるLinux

3章26話
シグナル処理
3章27話 ジョブ管理
もくじ
3章28話
execコマンド
ジョブ管理
若木 みどり
お兄ちゃん! シェルスクリプトの中でも バックグラウンド実行できるんだね!
若木 しげる
そうだね スクリプトの記述と ジョブが並列に動けば 効率よく処理できる場合があるんだ 特に時間のかかる処理を ジョブにすると有効だよ
若木 みどり
でもシェルスクリプトが終了しても ジョブはまだ動いている場合があるんだ スクリプト実行が終わっているのに 実際はまだ処理が続いているというのは なんだか落ち着かないよ…
若木 しげる
今回はシェルスクリプトでの ジョブ管理を学ぼう!
! 変数
若木 しげる
! 変数には 「直前に動かしたジョブのPID」 が入っているよ!
若木 みどり
シェル上でバックグラウンド実行すると 「ジョブ番号」「PID」 表示されていたよね ! 変数でも PID を知れるんだ!
若木 しげる
こんなふうに使うよ
sleep 60 &
PID="$!"
若木 みどり
ジョブの PID を PID 変数に代入しているんだね!PID さえ知れたらkill などで操作ができるよ!
wait コマンド
若木 しげる
wait指定された PID のプロセスが全て終了するまで待機するよ
wait [オプション]... PID...
若木 みどり
つまり wait をスクリプト内で使えばジョブが完了するまで待機できるんだね!
若木 しげる
そういうことだねではバックグランド実行とwait を使った例を見てみよう!
#!/bin/bash

# 時間のかかる処理の代わりをする関数
function heavy-task() {
  sleep "$((10 + (RANDOM % 10)))"
}

for COUNT in {1..10}
do
  heavy-task &
  PIDS="$PIDS${PIDS:+ }$!"
done

wait $PIDS
若木 みどり
PIDS の値で変数展開を使っているね読み解くと PIDS の値はジョブの PID がスペース区切りで並ぶことになるんだね!
若木 しげる
そのとおり!最後に wait $PIDS指定された PID を持つプロセス全てが終わるまで待機してからスクリプトを終了するんだ
まとめ
若木 みどり
今回はシェルスクリプトでのバックグラウンド実行を学んだよ!! 変数と wait を使ってジョブが終わるまで待機できるんだ!
若木 しげる
最近は CPU のコアが複数ある場合がほとんどだよバックグラウンド実行を使って効率良く処理を進めよう!