👌

シェルスクリプトでの並行処理

2024/04/19に公開

はじめに

このページではシェルスクリプトにおける並行処理の実装方法について記述します。シェルスクリプトで効率よくタスクを並行実行するテクニックを、具体的なコード例とともに解説します。

シェルスクリプトでの並行処理の基本

シェルスクリプトでは、複数のプロセスをバックグラウンドで同時に実行することにより、並行処理を実現することができます。これにより、タスクの完了を待たずに次のタスクを開始することが可能になり、全体の処理時間を短縮できます。

1. バックグラウンド実行

シェルスクリプトでコマンドをバックグラウンドで実行するには、コマンドの末尾に & を付けます。

# コマンドをバックグラウンドで実行
./some_script.sh &

この方法でスクリプトやコマンドを起動すると、シェルは新しいバックグラウンドプロセスを作成し、ユーザーは直ちに次のコマンドを入力できるようになります。

2. wait コマンドの利用

バックグラウンドで実行されたプロセスが完了するのを待つには、wait コマンドを使用します。これにより、すべてのバックグラウンドプロセスが終了するまでスクリプトの実行を一時停止できます。

./task1.sh &
./task2.sh &
./task3.sh &

# すべてのバックグラウンドプロセスが終了するのを待つ
wait
echo "All tasks are completed."

3. プロセスの管理

複数のプロセスを効率よく管理するためには、プロセスIDを変数に格納しておくと便利です。

#!/bin/bash

process1(){
    sleep 10
}

process2(){
    sleep 20
}

# 各プロセスをバックグラウンドで起動
process1 &
pid1=$!
process2 &
pid2=$!

# 各プロセスの終了を待つ
wait $pid1
wait $pid2

echo "プロセス1とプロセス2が完了しました"

4. xargsを使用した並行処理

xargs コマンドは、標準入力からデータを受け取り、それを引数として他のコマンドに渡すツールです。-P オプションを使うことで、指定した数のプロセスを並行して実行することが可能です。

# 4つのプロセスで並行してコマンドを実行
echo {1..10} | xargs -n1 -P4 ./process_item.sh

この例では、process_item.sh スクリプトを最大4つのプロセスで並行して実行します。これにより、10個のタスクを効率良く処理できます。

5. GNU Parallel の使用

GNU Parallelは、同時に多くのプロセスを実行するためのパワフルなシェルツールです。これを使用すると、複雑な並行処理も簡単に扱うことができます。

# GNU Parallelを使用して複数のスクリプトを同時に実行
parallel ./script_{} ::: {1..10}

このコマンドは、script_1 から script_10 までのスクリプトを同時に実行します。

コマンドの比較

  • &とwait:
    最も基本的でシンプルな並行処理方法です。しかし、プロセス管理が必要になる場合があります。
  • xargs:
    シンプルな並行実行が可能で、システムの負荷を抑えつつ複数のタスクを実行できます。
  • GNU Parallel:
    高度な並行処理と、複雑なシナリオに対応する機能が豊富にあります。大規模なデータ処理に適しています。

まとめ

シェルスクリプトでの並行処理は、スクリプトの実行時間を大幅に短縮することが可能です。バックグラウンド実行、xargs、GNU Parallelなどのツールを活用することで、様々なシナリオに合わせた並行処理が実現できます。これらのテクニックをうまく使い分けることで、効率的なシステム運用が可能になります。

Discussion