并行ping多个IP并创建列表:使用相同变量的多个线程(同步问题)

时间:2013-02-15 08:47:23

标签: bash parallel-processing synchronization ping

我需要ping一个设备列表并存储响应ping的IP。我有这段代码:

function add_ip_if_pings
{
    ping -c 1 -W 1 $1 > /dev/null
    if [ "$?" = "0" ]; then
        iplist="$iplist $1"
        echo $iplist
    fi
}

# ...

for id in $(seq "$2" "$3"); do
    for nr in $(seq 1 244); do
        add_ip_if_pings "10.$secondIpOctet.$id.$nr" &
    done

done

#waiting for all pings to finish
wait
echo "List: $iplist"

因此,当我在$iplist中打印add_ip_if_pings的值时,它总是包含一个ip。最后我得到了输出:

List:

我想这是某种同步问题,因为多个线程使用相同的变量。这里最好的解决方案是什么?我需要在paralell中ping所有设备,因为我不想永远等待...

1 个答案:

答案 0 :(得分:1)

不使用IP添加到变量,而是使用文件系统。在脚本的开头:

DATADIR=/tmp/multiping
rm -fr ${DATADIR} # Clean up data from previous run
mkdir ${DATADIR}  # Create directory

稍后在function add_ip_if_pings

touch ${DATADIR}/$1

在您的脚本结束时:

LIST=$( cd ${DATADIR} ; ls )