★悩み★
・Linuxであるコマンドを同時(並列)に実行することはできないのかな。
・Linuxであるシェルスクリプトを同時(並列)に実行できないのかな。
・parallelコマンドでコマンドを並列実行(処理)する手順を知りたい。
こういった「悩み」に答えます。
★本記事の内容★
① parallelコマンドでコマンドを並列実行(処理)するための準備をご紹介
② parallelコマンドでコマンドを並列実行(処理)する手順をご紹介
これからご紹介する「【実例掲載】parallelコマンドでコマンドを並列実行(処理)する手順」を実践したことで、Linuxのコマンドを簡単に2つ同時(並列)で実行できました。
記事の前半では「parallelコマンドであるコマンドを同時実行(並列実行)する手順」を解説しつつ、記事の後半では「parallelコマンドであるシェルスクリプトを同時実行(並列実行)する手順」を紹介します。
この記事を読み終えることで、「Linuxでparallelコマンドを用いて、あるコマンドやシェルスクリプトを簡単に同時実行(並列実行)できる」ようになります。
今回ご紹介する手順は、「curlコマンドを5多重で同時(並列)実行し、応答時間の性能値を採取したい」といった場面に使えます。
ちなみに、「parallelコマンドを使用せずに、あるコマンドやシェルスクリプトを同時実行(並列実行)する方法を知りたい」方には、以下の記事がおすすめです。
★parallelコマンドとは★
parallelコマンドは、ジョブ(コマンドやシェルスクリプトなど)を並列に実行するためのツールです。
参照:parallelコマンドとは(公式サイト)
parallelコマンドでコマンドを並列実行(処理)するための準備
「parallelコマンドでコマンドを並列実行(処理)するための準備」に関してご紹介します。
★parallelコマンドでコマンドを並列実行(処理)するための準備の流れ★
手順1:パッケージマネージャー(yumなど)でparallelコマンドをインストール
手順2:parallelコマンドがインストールされたことを確認
上記手順を実施することで、「parallelコマンドをインストール」できます。
上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年11月29日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)
以降で、上記「parallelコマンドでコマンドを並列実行(処理)するための準備の流れ」の各手順に関してご説明します。
手順1:パッケージマネージャー(yumなど)でparallelコマンドをインストール
「手順1:パッケージマネージャー(yumなど)でparallelコマンドをインストール」に関して解説します。
yum(dnf)やbrewなどのパッケージマネージャー経由で、parallelコマンドをインストールできます。
parallelコマンドをインストールするために、「端末またはコマンドプロンプト」を起動し、以下のコマンドをお手持ちの環境に合わせて実行してください。
【Fedora系(CentOS/RHELなど)のLinuxの場合、端末上で以下を実行】
# yum install parallel
【Debian系(Ubuntuなど)のLinuxの場合、端末上で以下を実行】
$ sudo apt install parallel
【Macの場合、端末上で以下を実行】
$ brew install parallel
【Windowsの場合、Webブラウザで以下にアクセス】
未対応(未サポート)
上記コマンドが異常終了した場合(echo $?の値が0以外)、「公式サイトで公開されているソースコードからparallelコマンドをインストール」することを検討してください。
以上で、「手順1:パッケージマネージャー(yumなど)でparallelコマンドをインストール」は完了です。
手順2:parallelコマンドがインストールされたことを確認
「手順2:parallelコマンドがインストールされたことを確認」に関して解説します。
yum(dnf)やbrewなどのパッケージマネージャー経由でインストールしたparallelコマンドのPathを確認しましょう。
parallelコマンドがインストールされたことを確認するために、「端末またはコマンドプロンプト」を起動し、以下のコマンドを順に実行してください。
# which parallel
/usr/bin/parallel
# parallel -help
Usage:
parallel [options] [command [arguments]] < list_of_arguments
parallel [options] [command [arguments]] (::: arguments|:::: argfile(s))...
cat ... | parallel --pipe [options] [command [arguments]]
-j n Run n jobs in parallel
-k Keep same order
-X Multiple arguments with context replace
--colsep regexp Split input on regexp for positional replacements
{} {.} {/} {/.} {#} {%} {= perl code =} Replacement strings
{3} {3.} {3/} {3/.} {=3 perl code =} Positional replacement strings
With --plus: {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} =
{+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...}
-S sshlogin Example: foo@server.example.com
--slf .. Use ~/.parallel/sshloginfile as the list of sshlogins
--trc {}.bar Shorthand for --transfer --return {}.bar --cleanup
--onall Run the given command with argument on all sshlogins
--nonall Run the given command with no arguments on all sshlogins
--pipe Split stdin (standard input) to multiple jobs.
--recend str Record end separator for --pipe.
--recstart str Record start separator for --pipe.
See 'man parallel' for details
Academic tradition requires you to cite works you base your article on.
When using programs that use GNU Parallel to process data for publication
please cite:
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
;login: The USENIX Magazine, February 2011:42-47.
This helps funding further development; AND IT WON'T COST YOU A CENT.
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
上記コマンド実行後、「コマンドPathやUsage」が表示された場合、「正常にparallelコマンドがインストールできた」と判断できます。
以上で、「手順2:parallelコマンドがインストールされたことを確認」は完了です。
上記の流れで、parallelコマンドをインストールできました。
parallelコマンドでコマンドを並列実行(処理)する手順
「parallelコマンドでコマンドを並列実行(処理)する手順」に関してご紹介します。
★parallelコマンドの用途★
用途1:parallelコマンドであるコマンドを同時実行(並列実行)
用途2:parallelコマンドであるシェルスクリプトを同時実行(並列実行)
parallelコマンドを利用することで「あるコマンドの同時実行(並列実行)」や「あるシェルスクリプトの同時実行(並列実行)」を実現できます。
上記の各手順は、以下の日時で動作確認済みです。
動作確認済み日時:2021年11月29日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)
以降で、上記「parallelコマンドの用途」の各用途に関してご説明します。
用途1:parallelコマンドであるコマンドを同時実行(並列実行)
「用途1:parallelコマンドであるコマンドを同時実行(並列実行)」に関して解説します。
「parallelコマンドを用いて、curlコマンドを同時実行(並列実行)する」例を用いて、解説しますね。
curlコマンドを2多重で同時実行(並列実行)したい場合、以下のparallelコマンドを実行してください。
# ↓↓ 筆者の測定環境(2コア環境で測定) ↓↓
# grep cpu.cores /proc/cpuinfo | sort -u
cpu cores : 2
# ↓↓ parallelコマンドでcurlを2多重で実行 ↓↓
# seq 1 6 | parallel -j 2 -n 0 'date +%Y%m%d_%H%M%S_%3N && curl -s -o /dev/null http://inet-ip.info'
20211129_132651_692 ★ 1回目の同時実行(並列実行)
20211129_132651_694 ★ 1回目の同時実行(並列実行)
20211129_132651_766 ★ 2回目の同時実行(並列実行)
20211129_132651_770 ★ 2回目の同時実行(並列実行)
20211129_132651_846 ★ 3回目の同時実行(並列実行)
20211129_132651_841 ★ 3回目の同時実行(並列実行)
#
コマンド実行後、上記の様な時刻が表示された場合、「正常にparallelコマンドでcurlコマンドを2多重で同時実行(並列実行)できた」と判断できます。
ちなみに、curlコマンドを1多重で同時実行(並列実行)したい場合、以下のparallelコマンドを実行します。
# seq 1 6 | parallel -j 1 -n 0 'date +%Y%m%d_%H%M%S_%3N && curl -s -o /dev/null http://inet-ip.info'
20211129_135526_247
20211129_135526_748
20211129_135526_808
20211129_135526_865
20211129_135526_924
20211129_135526_983
#
★parallelコマンドであるコマンドを実行する際のコマンド形式★
seq 1 <実行コマンドを実行する回数> |
parallel -j <並列実行数> -n <実行コマンドに渡す引数の数> ‘<実行コマンド>’
参照:parallelコマンドのリファレンス(公式サイト)
以上で、「用途1:parallelコマンドであるコマンドを同時実行(並列実行)」は完了です。
用途2:parallelコマンドであるシェルスクリプトを同時実行(並列実行)
「用途2:parallelコマンドであるシェルスクリプトを同時実行(並列実行)」に関して解説します。
「parallelコマンドを用いて、下記のシェルスクリプト(process.sh)を同時実行(並列実行)する」例を用いて、解説しますね。
# cat process.sh
job_num=$1
start_date=`date +%Y%m%d_%H%M%S_%3N`
sleep 1
end_date=`date +%Y%m%d_%H%M%S_%3N`
echo "No.${job_num} start[${start_date}] - end[${end_date}]" >> /var/tmp/parallel.log
#
上記シェルスクリプト(process.sh)を2多重で同時実行(並列実行)したい場合、以下のparallelコマンドを実行してください。
# ls
process.sh
# seq 1 6 | parallel -j 2 -n 1 'sh process.sh'
# cat /var/tmp/parallel.log
No.1 start[20211129_155552_389] - end[20211129_155553_397]
No.2 start[20211129_155552_393] - end[20211129_155553_398]
No.4 start[20211129_155553_409] - end[20211129_155554_423]
No.3 start[20211129_155553_406] - end[20211129_155554_423]
No.6 start[20211129_155554_435] - end[20211129_155555_468]
No.5 start[20211129_155554_431] - end[20211129_155555_468]
#
コマンド実行後、上記の様な時刻が表示された場合、「正常にparallelコマンドでシェルスクリプトを2多重で同時実行(並列実行)できた」と判断できます。
ちなみに、上記シェルスクリプト(process.sh)を1多重で同時実行(並列実行)したい場合、以下のparallelコマンドを実行します。
# ls
process.sh
# seq 1 6 | parallel -j 1 -n 1 'sh process.sh'
# cat /var/tmp/parallel.log
No.1 start[20211129_160340_517] - end[20211129_160341_587]
No.2 start[20211129_160341_596] - end[20211129_160342_698]
No.3 start[20211129_160342_707] - end[20211129_160344_025]
No.4 start[20211129_160344_034] - end[20211129_160345_074]
No.5 start[20211129_160345_083] - end[20211129_160346_086]
No.6 start[20211129_160346_095] - end[20211129_160347_168]
#
★parallelコマンドであるシェルスクリプトを実行する際のコマンド形式★
seq 1 <実行コマンドを実行する回数> |
parallel -j <並列実行数> -n <実行コマンドに渡す引数の数> ‘<実行コマンド>’
参照:parallelコマンドのリファレンス(公式サイト)
以上で、「用途2:parallelコマンドであるシェルスクリプトを同時実行(並列実行)」は完了です。
上記の流れで、parallelコマンドで「あるコマンド」と「あるシェルスクリプト」を並列実行(処理)できました。
【まとめ】parallelコマンドでコマンドを並列実行(処理)する手順【実例掲載】
いかがでしたでしょうか?「コマンドやシェルスクリプトを同時実行(並列実行)できるparallelコマンド」、「parallelコマンドを使った同時実行(並列実行)の事例」を解説し、以下の悩みを解決しました。
★悩み★
・Linuxであるコマンドを同時(並列)に実行することはできないのかな。
・Linuxであるシェルスクリプトを同時(並列)に実行できないのかな。
・parallelコマンドでコマンドを並列実行(処理)する手順を知りたい。
「parallelコマンド」を利用するだけで、「curlなどのコマンド」と「自作したシェルスクリプト」を同時実行(並列実行)できます。ぜひあなたも本記事を参考に「parallelコマンドを用いた同時実行(並列実行)」を実践してください。