curl
的 --parallel
Image Not Showing Possible ReasonsLearn More →
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
curl
指令就像是電腦系統上的瑞士刀,可靠、好用且無所不在。除了 Linux 和 macOS 系統內有提供,Win10 也在 2017 年後內建curl.exe
。時至今日,你可以說在任何平台的系統都能見到他。隨著 RESTful API 標準興起,很有可能你呼叫第一個 API,就是透過curl
指令完成
curl
在 2019 的 7.66 版 迎來新功能--parallel
,遊戲規則產生變化,我們不需再藉由外部工具如xargs
或GNU Parallel
,即可達成並行化 (concurrency) 工作。curl 開發者持續新增和修正相關功能,建議若要使用此功能直接選用最新版curl
本篇撰文者為系統管理員,測試環境為 Bash 搭配 curl 7.84.0
透過 server 的 BMC 提供的 redfish api (類似 restful api),演示 curl 的 --parallel
功能
本文連結: https://hackmd.io/@kmo/curl_parallel
任何回饋歡迎留言在此篇 hackmd :)
10.50.1.1
的 server 為例47
秒完成 😴bios
,若使用 -O, --remote-name
直接存檔,檔名相同(都叫 bios
)會彼此覆蓋,最後只存到 1 個 bios
檔案15
秒完成 👌--parallel
--parallel
並行化處理--parallel-immediate
: curl 預設會儘可能重複使用已建立的連線(multiplex),可加速處理需求並減少負載,不過當 URL 是不同來源,那 multiplex 效果就不大。使用此選項會把考慮 multiplex 的因子權重降低,儘可能開啟新連線。本文的實例就很適合使用--parallel-max
: 預設是 50 個並行工作,可以調整自己適用的情境--parallel
一次進行 30 個並行連線,此時指令為0.5
秒完成 👏問題解法 | 實際測試 |
---|---|
Bash 的 nested loop | 47 秒 |
匹配多個 URL (curl globbing) | 15 秒 |
使用 curl 的 --parallel |
0.5 秒 |
--write-out
取得 http 的 response_code
,並且搭配印出 url
對照。此時指令改為10.50.3.3
的回應是 000
,代表10.50.3.3
有不預期狀況發生-u
後面加 usr:pw
指定帳號密碼,這種方式在 linux 系統上是非常不安全的行為,若你使用的電腦為多人登入使用,此時其他用戶下 ps -ef | grep curl
之類指令,即可看到你使用 curl 指定的參數(當然包含密碼)。此時務必參閱 curl --config
方式,至少把密碼包在特定檔案retry
or fail
等關鍵字的 option。當然最快方式參考 github or stackoverflow 網友們的腳本,並依據自己情境調整Everything curl: curl 開發者寫的手冊,讚
curl 的 manpage: 網頁上查詢 option 好用
curl 的 globbing 範例: stackoverflow 網友的範例
curl 的 parallel 範例: stackoverflow 網友的範例