負荷テストの目的で、データベースから一連のクエリを同時にトリガーする単純なbashスクリプトを作成しようとしています。
これまで、以下の内容を含む「input_file」というファイルがあります。
select sleep(10);
select sleep(11);
select sleep(12);
select sleep(13);
select sleep(14);
select sleep(15);
select sleep(16);
select sleep(17);
select sleep(18);
select sleep(19);
select sleep(20);
その後、次のコードがあります。
IFS=$'\n'
for line in $(cat input_file)
do
{
mysql -S[socket] -u[username] -p[password] -e${line}
}
done
ただし、クエリを同時に実行するのではなく、一度に1つずつ実行し、次のクエリを開始する前に各クエリが完了するのを待ちます。最初のクエリを開始してから完了するまで待たずに、すべてのクエリを同時に実行し続けたいと思います。
私は反対の問題を抱えている人のための多くの投稿を見ましたが、彼らの「間違った」例がうまくいくことはできないようです。
答え1
&
mysqlコマンドの最後に追加してバックグラウンドで実行できるようにすることは、コメントセクションに記載されています。私はGNUを使用する別の方法を提案したいと思いますxargs
:
cat input_file | xargs --no-run-if-empty --delimiter '\n' --max-procs 0 -I '{}' mysql -S[socket] -u[username] -p[password] -e'{}'
# Or with short flags...
xargs -r -d '\n' -P 0 -I '{}' mysql -S[socket] -u[username] -p[password] -e'{}' < input_file
# Or letting xargs open the file and leave its stdin alone...
xargs --arg-file input_file -r -d '\n' -P 0 -I '{}' mysql -S[socket] -u[username] -p[password] -e'{}'
-r
/--no-run-if-empty
入力が空のときにmysqlが実行されないようにします。--delimiter '\n'
/-d '\n'
- エントリは新しい行で終わります。入力を処理するときの引用符とバックスラッシュは特別ではありません。入力のすべての文字は文字通り処理されます。このオプションがないと、バックスラッシュや引用符(SQLコードで一般的です)を含む入力では正しく機能しません。 」-P max-procs
/--max-procs=max-procs
- 一度に最大max-procsプロセスを実行します。デフォルトは 1 です。 max-procs が 0 の場合、xargs は一度にできるだけ多くのプロセスを実行します。-I replace-str
- 初期引数の置換 - strエントリを入力から読み取った名前に置き換えます。-a file
/--arg-file file
- 標準入力の代わりに指定されたファイルから引数を読み込みます。
GNUを使用する際の良い点は、パラメータをゼロ以外の数値に設定することで、同時xargs
プロセス数を制限できることです。この場合、入力が非常に長く、同時プロセスが多すぎてサーバーに影響を与える可能性がある場合は、同時実行性を制限できます。<max-procs>
-P