在 Shell 脚本内运行命令的并发实例

在 Shell 脚本内运行命令的并发实例

首先我要说的是,我仍在学习 bash 脚本,而且我不知道很多事情。如果我漏掉了什么,请随意骂我。

接下来,我将创建一个简单的 bash 脚本来运行 ping 到 2 个不同的主机并输出到文件。我已经解决了这个问题,并且正在发挥作用。出于好奇,我在脚本中添加了 ping 输出打印前后的输出日期,这样我就知道运行 ping 需要多长时间。我将 ping 设置为 1 秒间隔,10 次 ping,2 个主机。我的第一次约会(很久以前...)的时间戳是 14:36:20。第二个日期(ping 之后)的时间戳为 14:36:40。

因此,日期等待两个 ping 完成。这意味着 ping 是按顺序运行的。

我可以让它们同时运行,这样我就可以花 10 秒而不是 20 秒来运行脚本吗?

这是我的脚本片段:

date >> teste.txt
cat hosts.txt |  while read output
do   ping -c 10 -i 1 "$output" >> teste.txt
done
date >> teste.txt

我还希望这个脚本能完成其他几件事,但我保证只有在无法在 Barsa 上找到满意的答案时我才会询问。

PS:hosts.txt 是我存储要 ping 的主机的位置。

答案1

你的问题的措辞有点难以理解,但我认为你正在寻找类似的东西:

command & 
command &
wait

该脚本将在后台执行这两个命令并等待响应。

但是,就您而言,您需要小心竞争条件。您可能希望将各个命令的输出发送到临时文件中,然后将它们放入主文件中,因此您可能会执行以下操作:

command > "${tmp1}" & 
command > "${tmp2}" & 
wait
cat "${tmp1}" "${tmp2}" >> "${main}"
rm -f "${tmp1}" "${tmp2}"

更新:您可以尝试 xargs (例如https://stackoverflow.com/questions/15755422/linux-bash-script-to-ping-multiple-hosts-simultaneously

答案2

使用 GNU Parallel,您可以执行以下操作:

date >> teste.txt
cat hosts.txt |  parallel -j0 ping -c 10 -i 1 {} >> teste.txt
date >> teste.txt

相关内容