运行 同时文件的所有行

Run all lines of a file at the same time

while 循环工作正常。

但想知道是否有一种方法可以同时 运行 从一个文件中获取所有行,然后通过同一组命令 运行 变量而不是等待每个接口等待 3秒 ?

while read line; do
before=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$line | awk '{print }')
sleep 3
after=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$line | awk '{print }')
res=$(bc <<< "$after-$before")
zxc=$(echo "$res * 8 * 100 / (1000000000 * 3) "  | bc)
per=$(echo "scale=1; 100 * $zxc / (1000) "  | bc)
done < intfile.txt

谢谢

可以使用GNU's parallel

将命令移动到单独的文件command.sh:

before=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16. | awk '{print }')
sleep 3
after=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16. | awk '{print }')
res=$(bc <<< "$after-$before")
zxc=$(echo "$res * 8 * 100 / (1000000000 * 3) "  | bc)
per=$(echo "scale=1; 100 * $zxc / (1000) "  | bc)

然后以intfile.txt作为输入执行并行

 cat intfile.txt | parallel -j 5 'bash command.sh {}'
  • j 标志设置有多少作业将 运行 同时

根据@Gonzalo 的回答,您可以使用 bash 函数将 command.sh 移动到同一脚本中:

walk_one() {
    do_the_walk() {
      snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16. |
        awk '{print }'
    }
    before=$(do_the_walk )
    sleep 3
    after=$(do_the_walk )
    res=$(bc <<< "$after-$before")
    zxc=$(echo "$res * 8 * 100 / (1000000000 * 3) "  | bc)
    per=$(echo "scale=1; 100 * $zxc / (1000) "  | bc)
}
export -f walk_one

cat intfile.txt | parallel -j 5 walk_one {}