mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Linux - シェルスクリプトでバックグランド並行処理!

[ サーバ構築 ] [ Linux, Unix, bash, シェル ]

こんばんは。

Linux(Unix 含む) 等のシェルスクリプトで複数の処理を並行で処理する方法についてのメモです。

シェルスクリプト内で複数の処理を流す場合、1つずつ流しても良いのですが、同時に並行して流した方が効率がよい場合があります。 特に、昨今のCPUはマルチコアプロセッサなので、そういう並行処理は得意のはずです。

以下、サンプルです。

記録

0. 前提条件

  • Cygwin 1.7.15 での作業を想定していますが、Linux, BSD でも同様です。
  • 使用するシェルは bash です。

1. サンプルスクリプト

以下、シェルスクリプトのサンプルです。 4つのプログラムをバックグラウンドで流し、4つ全てが終了したら次のプログラムをフォアグランドで流す例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh

# 複数の並行で流したい処理をバックグランドで流す
program_1 &
program_2 &
program_3 &
program_4 &

# 全てのバックグラウンド処理が終了するまで待機
wait

# 次の処理(フォアグランドで流す)
program_a

並行で流したいプログラムを & を付けて実行するだけです。

バックグラウンド処理が全て終了するまで待機したい場合は wait コマンドを使用する。

ちなみに、wait $! とした場合は、$! に「最後に実行したバックグラウンドコマンドのPID」がセットされているので、最後にバックグラウンド実行したプログラムが終了するまで待機することになる。


確かに、1つずつ順に直列処理した場合に比べて、若干高速で全体的な処理時間が短くなります。 当然、CPU使用率(負荷)は高くなりますが。。。

以上。

Comments