在Bash脚本和捕获输出时使用&符号(&)的背景中的Fork命令

时间:2015-12-13 11:17:35

标签: linux bash shell

我希望在后台分叉一个进程,同时在bash脚本中捕获输出。

我可以运行以下脚本来ping一个IP列表,它会将每个调用移动到后台并运行得非常快。但它并没有捕获执行命令的输出以进行进一步处理。

for i in $(cat list.txt); do 
    ping -c 1 $i &
done

我希望在命令中运行带有&符号的这种形式的脚本来在后台推送每次ping操作,但是与上面的脚本相比,它运行速度非常慢,这表明脚本没有并行执行。 / p>

for i in $(cat list.txt); do 
    y=$( ping -c 1 $i & )
    echo "$y"
done

请告知如何在捕获命令输出的同时在后台实现并行执行

由于 约翰

1 个答案:

答案 0 :(得分:1)

下面的脚本看起来很慢,因为你试图回显循环中的变量。因此,只有当所有分叉进程完成时,最后一个echo才会完成,从而使其顺序完成。

for i in $(cat list.txt); do 
    y=$( ping -c 4 1 $i & )
    echo "$y"
done

相反,你可以做这样的事情

#!/bin/bash
count=0
for i in $(cat list.txt); do  
    y[count++]=$( ping -c 1 $i & )
done

此函数与第一个函数一样快,并且在数组y中有stdout。