長時間実行されているプロセスを複数回並行して実行しようとしています。プロセスの各実行のパラメーターは、スペースで区切られた環境変数に格納されます。これが私が実行しようとしているものの不自然な例です:
$ echo -e 1 2 3 4 | xargs --max-procs=3 --max-args=1 --replace=% echo % is the number being processed
そのコマンドの出力は次のとおりです。
1 2 3 4 is the number being processed
Max-argsが無視されているように見えるのはなぜですか?次に、より良い結果が得られる区切り文字を明示的に設定しようとしました。
$ echo -e 1 2 3 4 | xargs -d " " --max-procs=3 --max-args=1 --replace=% echo % is the number being processed
1 is the number being processed
2 is the number being processed
3 is the number being processed
4
is the number being processed
4番目の引数を処理するときにxargsは何をしていますか?
いくつか検索した後、私はほとんど私が欲しいものを手に入れることができました。引数は正しく処理されますが、並列処理は機能しません(ここに示されていない別のコマンドで確認されます)。
$ echo -e 1 2 3 4 | xargs -n 1 | xargs --max-procs=3 --max-args=1 --replace=% echo % is the number being processed
1 is the number being processed
2 is the number being processed
3 is the number being processed
4 is the number being processed
何が足りないのですか?
しますか
echo -e 1 2 3 4 | sed -e 's/\s\+/\n/g' | xargs --max-procs=3 --max-args=1 --replace=% echo % is the number being processed
タスクを達成しますか?出力はほぼ正しいようです:
1 is the number being processed
2 is the number being processed
3 is the number being processed
4 is the number being processed
また、echo
をsleep
に置き換えて、並行して実行されることを確認しました。
echo -e 1 2 3 4 5 6 7 8 9 9 9 9 9 9 9 9 9 9 9 9 | sed -e 's/\s\+/\n/g' | xargs --max-procs=20 --max-args=1 --replace=% sleep 1
-n
、-max-args
を使用した、他のいくつかの方法、おそらくもっと簡単な方法:
echo -n "foo bar baz" | tr ' ' '\n' | xargs -n 1 echo # With \n, no need for -0
echo -n "foo bar baz" | tr ' ' '\0' | xargs -0 -n 1 echo # Using null character
echo -n "foo bar baz" | xargs -d ' ' -n 1 echo # Telling to xargs the delimiter
echo
は任意のコマンドにすることができます。-L
パラメーターおよび-d '\n'
(スペースを含む行の場合)も参照してください。--max-procs
と並行して勝ちますが、 parallel
の方が良いかもしれません。