【问题标题】:Run all lines of a file at the same time同时运行文件的所有行
【发布时间】:2021-12-06 21:13:05
【问题描述】:

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

感谢

【问题讨论】:

  • 将您的处理代码重建为 1 个脚本。然后在后台调用这个 1 脚本,每行作为参数。因此,您的 while 循环将启动与 intfile.txt 中的行数一样多的处理脚本实例。

标签: bash while-loop


【解决方案1】:

可以使用GNU's parallel

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

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

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

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

【讨论】:

  • 它确实有效,但是当放置一段时间后它会停止产生任何结果,就像它被冻结一样,一段时间后我得到......并行:收到 SIGTERM。不会开始新的工作。并行:等待这 1 个作业完成。再次发送 SIGTERM 以立即停止。你知道有什么解决办法吗?
  • @Max 试试parallel -t -j1。如果还是失败,是不是每次都在同一行失败?
  • @Gonzalo 考虑使用 s 函数。这样您就不需要单独的文件。 gnu.org/software/parallel/…
  • @Gonzalo 考虑一下,它是相同的,但在错误日志文件中,我可以看到 ./bash 与并行运行的每个变量,它只会越来越大,但脚本仍然可以工作一段时间。在一个单独的文件中,我有“while true; cat intfile.txt | parallel -j 5 'bash command.sh {}'”。
  • @Ole Tange,我将如何处理单个文件?使用 -S 函数?阅读这些示例并不能从中获得太多好处
【解决方案2】:

根据@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.$1 |
        awk '{print $4}'
    }
    before=$(do_the_walk $1)
    sleep 3
    after=$(do_the_walk $1)
    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 {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多