LoginSignup
39
37

More than 5 years have passed since last update.

サブシェルを使用し、ワンライナーで実行するコマンドを並列実行

Last updated at Posted at 2014-03-07

サブシェル(子シェル)

()でコマンドを括ると、親シェルからサブシェルとしてコマンドを実行することが可能となる。
サブシェルは、親のシェルの環境変数等を汚したくない時によく使う。

よく使うパターン(1)

一時的に環境変数LANGを英語に変更し、英語でmanpageを見たいとき

$ (LANG=C; man 3 printf)

よく使うパターン(2)

親シェルで一時的にディレクトリを変更して作業したいとき

script
# シェル・スクリプト内で
cd topdir

(cd builddir; make)

# カレントディレクトリは、topdir

よく使うパターン(3)

遅延コマンド実行

script
# シェル・スクリプト内で
(sleep 60; command)&

ワンライナーで実行するコマンドを並列実行

よく使うパターン(3)の振る舞いを応用して、for in do done, while do doneの構文に当てはめれば、ワンライナーで実行するコマンドの並列実行が可能となる。

よく使うパターン[1]: コマンドの応答を待たずに、定期的にコマンドを実行

$ while true; do (sleep 10; program)& done

よく使うパターン[2]: 重い処理のコマンドが成功したらログを保存

$ for i in `seq 1 10`; do ( 重い処理のコマンド && 結果を保存するコマンド )&; done

例.ネットワーク内の機器を検索

$ for i in `seq 1 254`; do (ping -c 1 192.168.1.$i && echo "192.168.1.$i is alive" >> log)&; done
$ cat log
192.168.1.1 is alive
192.168.1.13 is alive
192.168.1.101 is alive
192.168.1.251 is alive
192.168.1.254 is alive

別の方法での並列実行

  • xargs -P
  • parallelコマンド

上記コマンドを使用することで並列でコマンド実行することが可能です。

39
37
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
39
37