2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ぼっちの雑多Advent Calendar 2024

Day 15

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

Last updated at Posted at 2024-12-14

シェルスクリプトでコマンドを並列実行する方法を2つ紹介します。

1. & (バックグラウンド実行) と wait

最もシンプルな並列処理の方法です。コマンドの末尾に & を付けると、そのコマンドはバックグラウンドで実行されます。wait コマンドは、バックグラウンドで実行中のすべてのプロセスが終了するまで待機します。

#!/bin/bash

command1 &
command2 &
command3 &

wait

echo "All commands finished."

command1command2command3 はそれぞれ別のプロセスとしてバックグラウンドで実行されます。wait コマンドによって、すべての処理が完了するまでスクリプトの実行が一時停止します。 全てのコマンドの実行が完了した後、"All commands finished." が出力されます。

2. 制限付き並列処理

配列と wait -n を組み合わせることで、並列実行数を制限した処理が可能です。

#!/bin/bash

commands=("command1 arg1" "command2 arg2" "command3 arg3")
max_parallel=2  # 最大並列数
running=0       # 現在実行中のプロセス数

for command in "${commands[@]}"; do
  while [[ $running -ge $max_parallel ]]; do
    wait -n  # いずれかのバックグラウンドプロセスが終了するまで待機
    running=$((running - 1)) # 終了したプロセス数を減算
  done

  eval "$command" &  # コマンドをバックグラウンドで実行
  running=$((running + 1)) # 実行中のプロセス数を加算
done

wait # 全てのバックグラウンドプロセスが終了するまで待機

commands 配列に実行したいコマンドを格納します。 max_parallel で並列実行数を制限します。 running 変数で現在実行中のプロセス数を追跡します。

for ループでコマンドを一つずつ取り出し、while ループで実行中のプロセス数が max_parallel を超えないように制御します。 wait -n は、いずれかのバックグラウンドプロセスが終了するまで待機します。プロセスが終了すると、running をデクリメントし、次のコマンドを実行します。 eval は、文字列として格納されたコマンドを実行するために使用します。

この方法では、最大並列数を max_parallel で指定した値に制限しながらコマンドを実行できます。 wait -n を使うことで、プロセスが終了するたびに次のコマンドを実行するため、効率的に並列処理を行うことができます。 最後に wait で全てのバックグラウンドプロセスが完了するまで待機します。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?