У меня есть скрипт bash, в котором перечисляется количество ip-адресов, подключенных к порту. Моя проблема в том, что с большим количеством подключений она медленнее, чем poo. Я думаю, что это из-за использования подоболочек, но у меня возникли проблемы с их устранением, не откладывая остальную часть скрипта. Вот сценарий в полном объеме, как это довольно короткий:Оптимизация сценария Bash, удаление подоболочки
#!/bin/bash
portnumber=80
reversedns_enabled=0
[ ! -z "${1}" ] && portnumber=${1}
[ ! -z "${2}" ] && reversedns_enabled=${2}
#this will hold all of our ip addresses extracted from netstat
ipaddresses=""
#get all of our connected ip addresses
while read line; do
ipaddress=$(echo ${line} | cut -d' ' -f5 | sed s/:[^:]*$//)
ipaddresses="${ipaddresses}${ipaddress}\n"
done < <(netstat -ano | grep -v unix | grep ESTABLISHED | grep \:${portnumber})
#remove trailing newline
ipaddresses=${ipaddresses%%??}
#output of program
finaloutput=""
#get our ip addresses sorted, uniq counted, and reverse sorted based on amount of uniq
while read line; do
if [[ ${reversedns_enabled} -eq 1 ]]; then
reversednsname=""
#we use justipaddress to do our nslookup(remove the count of uniq)
justipaddress=$(echo ${line} | cut -d' ' -f2)
reversednsstring=$(host ${justipaddress})
if echo "${reversednsstring}" | grep -q "domain name pointer"; then
reversednsname=$(echo ${reversednsstring} | grep -o "pointer .*" | cut -d' ' -f2)
else
reversednsname="reverse-dns-not-found"
fi
finaloutput="${finaloutput}${line} ${reversednsname}\n"
else
finaloutput="${finaloutput}${line}\n"
fi
done < <(echo -e ${ipaddresses} | uniq -c | sort -r)
#tabulate that sheet son
echo -e ${finaloutput} | column -t
Большинство времени, затрачиваемого делает эту операцию: echo ${line} | cut -d' ' -f5 | sed s/:[^:]*$//
, что это лучший способ, чтобы встроить это, чтобы произвести быстрый сценарий. Это занимает много времени с 1000 одновременных пользователей (это моя базовая цель, хотя и должна обрабатывать больше, не используя весь мой процессор).
Это не необоснованный сценарий. Попробуйте запустить его из командной строки, используя опцию '-v' для' bash' - например. 'bash -v script-name'. Этот параметр будет печатать каждую строку по мере ее чтения. Посмотрите, произошла ли какая-либо заметная задержка сразу после печати строки на экране. Это будет место для поиска проблем с производительностью в вашем скрипте. – Ned
Ага, спасибо за это, я не знал о переключателе -v. Итак, проблема связана с подоболочками, которые, я считаю, эта строка в частности: echo $ {line} | cut -d '' -f5 | sed s /: [^:] * $ // – jett
Я ценю, что @ElliottFrisch, вы правы. – jett