Bash

是’cmd1newlinen和在l一世n和newlinecmd2’ 與 Bash 腳本中的 ‘cmd1 & cmd2’ 一樣並發嗎?

  • February 28, 2022

執行以下腳本

#!/usr/bin/bash

while true
do
 ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post & ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog
done

做完全一樣的

#!/usr/bin/bash

while true
do
 ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post 
 ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog
done

根據我的經驗,第一個腳本比第二個腳本(超過 10 分鐘後)更快地創建nalog文件(幾秒鐘內),這向我表明後者等待ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog完成。它不應該是這樣的,因為從我到目前為止的研究來看,第二個腳本是在ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog不等待ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post完成的情況下開始的。我希望這兩個ab命令同時執行,我如何在 Bash 中完成這個?

PS它是&和不是&&。我知道什麼&&可以和不想在這裡應用它。

不,cmd1 [newline] cmd2不像cmd1 & cmd2- 前者在開始之前等待cmd1完成cmd2

如果您希望在第一個命令執行時繼續執行,則需要將其&拆分為兩行:

ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post & ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog

變成

ab -c 700 -n 100000000000 -r http://crimea-post.ru/ >>crimea-post &
ab -c 700 -n 100000000000 -r http://nalog.gov.ru/ >>nalog

如果要確保兩個命令在再次循環之前完成,可以使用wait.

其他 shell 構造也提供並發,尤其是管道:(a | b或在某些 shell 中的變體a |& b,用於重定向兩個輸出流¹)同時執行,ab等待兩者都完成後再繼續。一些 shell 還支持協同程序(請參閱如何在各種 shell 中使用命令 coproc?)和程序替換(請參閱如何在各種 shell 中使用命令 coproc?),可用於同時執行命令。

請參閱什麼是 shell 的控制和重定向運算符?有關列表終止符(包括&)和管道運算符的詳細資訊。


¹ 除了在 ksh 中,它a作為協同程序執行。

引用自:https://unix.stackexchange.com/questions/692358