Ускорьте копать -x в скрипте bash - PullRequest
1 голос
/ 06 марта 2019

Мне нужно выполнить в моем университете как сценарий bash для обратного поиска всех своих записей DNS для сетевого блока класса B, которым они владеют.

Это самый быстрый вариант, который у меня есть, но он работает вечно.Любая помощь в оптимизации этого кода?

#!/bin/bash
network="a.b"

CMD=/usr/bin/dig

for i in $(seq 1 254); do

    for y in $(seq 1 254); do
        answer=`$CMD -x $network.$i.$y +short`; 
        echo $network.$i.$y ' resolves to ' $answer >> hosts_a_b.txt;
    done
done

1 Ответ

0 голосов
/ 06 марта 2019

Использование GNU xargs для запуска 64 процессов одновременно может выглядеть следующим образом:

#!/usr/bin/env bash

lookupArgs() {
  for arg; do
    # echo entire line together to ensure atomicity
    echo "$arg resolves to $(dig -x "$arg" +short)"
   done
}
export -f lookupArgs

network="a.b"
for (( x=1; x<=254; x++ )); do
  for (( y=1; y<=254; y++ )); do
    printf '%s.%s.%s\0' "$network" "$x" "$y"
  done
done | xargs -0 -P64 bash -c 'lookupArgs "$@"' _ >hosts_a_b.txt

Обратите внимание, что это не гарантирует порядок вывода (и полагается на функцию lookupArgs, выполняющую один write()syscall на результат) - но вывод сортируется, поэтому вы можете изменить порядок.В противном случае можно получить упорядоченный вывод (и обеспечить атомарность результатов), переключившись на параллельную GNU - большой скрипт на perl против небольшой, простой и относительно малочисленной реализации GNU xargs.

...