お兄ちゃん!
シェルスクリプトの中でも
バックグラウンド実行できるんだね!
そうだね
スクリプトの記述と
ジョブが並列に動けば
効率よく処理できる場合があるんだ
特に時間のかかる処理を
ジョブにすると有効だよ
でもシェルスクリプトが終了しても
ジョブはまだ動いている場合があるんだ
スクリプト実行が終わっているのに
実際はまだ処理が続いているというのは
なんだか落ち着かないよ…
今回はシェルスクリプトでの
ジョブ管理を学ぼう!
!
変数!
変数には
シェル上でバックグラウンド実行すると
「ジョブ番号」「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 のコアが複数ある場合がほとんどだよバックグラウンド実行を使って効率良く処理を進めよう!