2017/01/14 · GNU parallelを使うとコマンドを並列実行でき、細かい制御ができる。使い方もそれほど難しくない。しかし、OSに標準で入っているxargsでも簡単な制御 ...
2017/01/14 · GNU parallelを使うとコマンドを並列実行でき、細かい制御ができる。使い方もそれほど難しくない。しかし、OSに標準で入っているxargsでも簡単な制御 ...
シェルからでも重い処理というのはちょこちょこあって、例えば超デカいログファイルを移動して圧縮したりというお仕事は世界中のあらゆる場所で毎日行われていたりする。コマンドラインからでも大量の圧縮済みログファイルをいっぺんに展開したい、とか。 あるディレクトリ以下に存在するたくさんのファイルを(圧縮済みのものを除いて)全部 bzip2 圧縮したい!と思ったら、とりあえずさくっと次のようにコマンドラインで叩けばいい。 $ find . -not -name '*.bz2' | xargs bzip2 これで、まあそんなに問題なく効率的にbzip2圧縮ができる。だがしかし。 最近は複数コアのCPUが普通に転がってるし、あまつさえHyperThreadingが有効になってたりしてOSから見える論理CPU数がハンパない。普通に8とかある。その一方で複数コアを使用してくれるコマンドというのはあんまりなくて
GNU parallelを使うとコマンドを並列実行でき、細かい制御ができる。使い方もそれほど難しくない。 しかし、OSに標準で入っているxargsでも簡単な制御でよければ並列処理ができる。 基本的な使い方 処理対象が100個あり、1プロセスあたり4個を引数にして、同時に3個のプロセスを起動させる例: $ seq 100 | xargs -t -P3 -n4 ruby -e 'sleep 5' -t 実行する前にそのコマンドラインを表示する -P3 3プロセスを並列に実行 -n4 各プロセスが引数4個をとるようにする(入力をスペースによって引数に区切る) -Pを指定した場合は-nまたは-Lも同時に指定すること。そうしないと1プロセスしか起動してこない。 $ watch -n1 'ps aux | grep [r]uby' ken 18746 0.7 0.2 141948 9136 pts/1
Linux と Mac で xargs の挙動が違うのは以前から認識していたが、詳細までは調べていなかった。今回、プライベートの git レポジトリをコミットして Mac で xargs を実行した際に illegail option -- i と怒られてしまったので、これを機会に xargs が Linux と Mac 両方できちんと動作するように修正した。 Linux では動く、Mac では動かない # da = dot apply alias da="ls -A ~/git/$repo/t/dot/ | xargs -i cp {} $HOME && pushd $HOME && source $HOME/.bash_profile && popd" Mac 版の xargs (BSD) では -i オプションがサポートされていないのが問題だった。 $ da xargs: illeg
最終更新 2019-01-26 UNIX/Linux の xargs コマンドは、標準入力から受け取った文字列を、コマンドの引数として指定できるコマンドである。コマンドライン文字列が長すぎるエラーを回避に使用する。また、xargs の実装によっては並列実行して処理を高速化させることができる。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く