Opensource.comは2018年5月10日(米国時間)、「Get more done at the Linux command line with GNU Parallel|Opensource.com」において、コマンドを並列に実行するためのシェルユーティリティ「parallel」の使い方を紹介した。

parallelコマンドはデフォルトではインストールされていないことが多い。各パッケージ管理システムにおけるインストール方法は次のとおり。

パッケージ管理システム コマンド
apt sudo apt install parallel
pkg pkg install parallel
brew brew install parallel

続いて、標準入力からデータを受け取る場合のparallelコマンドの主な使い方は次のとおり。

標準入力からデータを受け取る場合の基本的な使い方

コマンド | parallel -I% --max-args 1 コマンド %

parallelコマンドの動作確認例 その1

$ seq 1 10 | parallel -I% --max-args 1 echo anycmd % % 2> /dev/null
anycmd 1 1
anycmd 2 2
anycmd 3 3
anycmd 4 4
anycmd 5 5
anycmd 6 6
anycmd 7 7
anycmd 8 8
anycmd 9 9
anycmd 10 10
$

-I%が標準入力から渡ってくるデータに置換される仕組みになっている。

parallelコマンドの動作確認例 その2

$ seq 1 10 | parallel -I% --max-args 2 echo anycmd % % 2> /dev/null
anycmd 1 2 1 2
anycmd 3 4 3 4
anycmd 5 6 5 6
anycmd 7 8 7 8
anycmd 9 10 9 10
$

--max-argsで指定する値を変更すると、%の置換対象が指定された個数まで増える。この辺りまでの動作は標準コマンドとしてインストールされているxargsと似ている。

parallelコマンドはコマンドの並列処理させるオプション(--jobs #)を提供しており、この機能を利用することで並列に実行することが可能になる。例えば、次のようにsleepコマンドをparallelコマンドに流し込んで処理させると、sleepコマンドを並列に処理することが可能。

--jobsオプションを使って処理を並列に実行させる

# seq 100 109 | parallel --jobs 10 -I% --max-args 1 sleep % 2> /dev/null

別の端末から次のようにコマンドが並列で実行されていることを確認できる。

parallelコマンドで並列に実行されたコマンドの例

# ps d
  PID TT  STAT    TIME COMMAND
47596  0  Is   0:03.54 -fish (fish)
53312  0  S    0:00.03 - sh
54561  0  S+   0:00.17 `-- perl /usr/local/bin/parallel --jobs 10 -I% --max-arg
54580  0  S    0:00.00   |-- sleep 100
54581  0  S    0:00.00   |-- sleep 101
54582  0  S    0:00.00   |-- sleep 102
54583  0  S    0:00.00   |-- sleep 103
54584  0  S    0:00.00   |-- sleep 104
54585  0  S    0:00.00   |-- sleep 105
54586  0  S    0:00.00   |-- sleep 106
54587  0  S    0:00.00   |-- sleep 107
54588  0  S    0:00.00   |-- sleep 108
54589  0  S    0:00.00   `-- sleep 109
...略...
# 

最近は、シングルコアではなくマルチコアのプロセッサを搭載しているマシンが多い。こうしたシステムのプロセッサ性能を効率的に使うために、parallelのようにコマンドを並列に処理するユーティリティを使うことができる。

  • parallelコマンドで並列に動作しているコマンドを確認

    parallelコマンドで並列に動作しているコマンドを確認