로드 테스트 목적으로 데이터베이스에서 일련의 쿼리를 동시에 트리거하는 간단한 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
&
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를 사용할 때 좋은 점은 매개변수를 0이 아닌 다른 숫자로 설정하여 xargs
동시 프로세스 수를 제한 할 수 있다는 것입니다. 이 경우 입력 내용이 매우 길고 동시 프로세스가 너무 많아 서버에 영향을 줄 수 있는 경우 동시성을 제한할 수 있습니다.<max-procs>
-P