Помощь в bash для нескольких потоков

У меня есть список IP-адресов, и мне нужно проверить их на открытые порты, используя nmap . Пока что мой сценарий выглядит так:

 #!/bin/bash filename="$1" port="$2" echo "STARTING NMAP" while IFS= read -r line do nmap --host-timeout 15s -n $line -p $2 -oN output.txt | grep "Discovered open port" | awk {'print $6'} | awk -F/ {'print $1'} >> total.txt done <"$filename" 

Он работает отлично, но он медленный, и я хочу проверить, например, 100 IP-адресов из файла одновременно, вместо того, чтобы запускать их один за другим.

Вот один из способов:

 #!/bin/bash filename="$1" port="$2" echo "STARTING NMAP" ## Read the file in batches of 100 lines for((i=100;i<=$(wc -l < "$filename");i+=100)); do head -n "$i" "$filename" | tail -n 100 | while IFS= read -r line do ## Launch the command in the background nmap --host-timeout 15s -n $line -p $2 -oN output.txt | grep "Discovered open port" | awk {'print $6'} | awk -F/ {'print $1'} >> total.txt & done ## Wait for this batch to finish before moving to the next one ## so you don't spam your CPU wait done 

Вы можете использовать опцию -iL для передачи файла в список IP-адресов назначения, которые могут быть разделены пробелами, вкладками или новыми строками и не нуждаются в цикле.

Вы можете запускать команды в фоновом режиме:

 nmap ... >> total.txt & 

Может быть полезно подождать внутри скрипта для завершения всех фоновых процессов:

 [...] done <"$filename" wait