
這是我的 shell 腳本:
for i in `seq 1 $1`; do
filename=randomfile$(uuidgen).txt
head -c $2 </dev/urandom > $filename
checksum256=$(sha256sum $filename | awk '{ print $1 }')
attrs=$(jq -n --arg cf "$checksum256" '{ "confidential":"N", "transactionId": "sdf", "codiDirCorp": "CorpCode", "expiration": "10/10/2025", "description": "desc", "locked": "N", "title": "titol", "docHash": $cf }')
curl -X POST \
'http://localhost:8083/documents?application=RDOCUI&user=nif' \
-F docFile=@$filename \
-F 'docAttributes='"${attrs}"''
done
如您所見,我正在生成幾個具有隨機內容的文件。
之後,我只需執行一個curl 請求即可上傳它們。
為了執行該命令,我只需輸入:
$ ./stress.sh 1000 200K
在這裡,我產生了 1000 個文件和 1000 個上傳請求。
我想加快它並行運行這些請求的速度。
有任何想法嗎?
答案1
Xargs 可以在前台執行此操作,它可讓您控制並行性和批次。 Curl 將重複使用一個開啟的連線來大量發送所有請求。
-P 42
定義curl
一次運行多少個。定義每次呼叫將處理
-n 23
多少個請求。禁用批次處理。curl
-n 1
與重擊
#! /bin/bash
URL='http://localhost:8083/documents?application=RDOCUI&user=nif'
for i in `seq $1`
do
filename=randomfile$(uuidgen).txt
head -c $2 </dev/urandom > $filename
export checksum256=$(sha256sum $filename | awk '{ print $1 }')
attrs=$(jq -n '{ "foo": "bar", "docHash": env.checksum256 }')
printf -- '--next %q -F docFile=@%q -F docAttributes=%q\0' "$URL" "$filename" "$attrs"
done |
xargs -0 -n 23 -P 42 bash -c 'eval "$0" "$@"' curl
此for
循環將\0
空格分隔的參數組寫入管道以供 Xargs 讀取。這些參數要傳遞給 Curl。 Xargs 依序將它們傳遞給 Bash,因此它們被指派給"$1"
, "$2"
, ...(又稱"$@"
)。現在我們用來eval
取消參數分組。任何特殊字元都已使用 正確轉義printf %q
,因此 Bash 不會執行任何不必要的引號刪除或分詞操作。
"$0" "$@"
將擴展到curl --next http://l... --next ...
Curl 將嘗試僅進行一次 TCP 握手,並重複使用該持久連線來傳送其參數中列出的所有請求。根據請求大小,可能會帶來一些明顯的加速。
附破折號
Dash 不支持printf %q
,但如果您的 JSON 格式可以被犧牲(透過jq -c
),您可以使用 來轉義它printf '%s'
。我們也必須依賴這樣的假設:JSON 和其他參數都不包含'
.
#! /bin/sh
# ...
attrs=$(jq -n -c '{ "foo": "bar", "docHash": env.checksum256 }')
printf -- "--next %s -F 'docFile=@%s' -F 'docAttributes=%s'\0" "$URL" "$filename" "$attrs"
done |
xargs -0 -n 23 -P 42 sh -c 'eval "$0" "$@"' curl
沒有for
您特別詢問了有關並行運行請求部分的問題。但是如果您想並行運行整個腳本,您可以按以下方式鍵入命令
$ seq 1000 | xargs -n 1 -P 42 ./stress.sh 1 200K
答案2
你可以隨時看看諾哈普
for i in `seq 1 $1`; do
filename=randomfile$(uuidgen).txt
head -c $2 </dev/urandom > $filename
checksum256=$(sha256sum $filename | awk '{ print $1 }')
attrs=$(jq -n --arg cf "$checksum256" '{ "confidential":"N", "transactionId": "sdf", "codiDirCorp": "CorpCode", "expiration": "10/10/2025", "description": "desc", "locked": "N", "title": "titol", "docHash": $cf }')
nohup curl -X POST \
'http://localhost:8083/documents?application=RDOCUI&user=nif' \
-F docFile=@$filename \
-F 'docAttributes='"${attrs}"''
done
nohup 告訴 shell 在背景執行該進程,無需使用者輸入,忽略掛斷訊號。所以你應該同時執行多個 CURL