Следующий код bash предназначен для ежесекундной проверки количества НОВЫХ (относительно последней секунды) файлов сетевых сокетов. в конце прогона он суммирует каждые 60 записей (должно быть 60 секунд) и выводит файл с именем verdict.csv, который сообщает мне, сколько новых сетевых сокетов было открыто за эту минуту (я исхожу из предположения, что эти сокеты живут дольше более 1 секунды и, следовательно, я не пропускаю новые).
Проблема начинается, когда я запускаю его на загруженном сервере, где у меня открыто много новых сетевых сокетов, затем я начинаю видеть, что итерации lsof_func занимают гораздо больше 1 секунды (даже больше минуты несколько раз), и чем я не могу доверять выходу этого скрипта.
#!/bin/bash
TIMETORUN=84600 # Time for the script to run in seconds
NEWCONNECTIONSPERMINUTE=600
# collect number of new socket files in the last second
lsof_func () {
echo "" > /tmp/lsof_test
while [[ $TIME -lt $TIMETORUN ]]; do
lsof -i -t > /tmp/lsof_test2
echo "$(date +"%Y-%m-%d %H:%M:%S"),$(comm -23 <(cat /tmp/lsof_test2|sort) <(cat /tmp/lsof_test|sort) | wc -l)" >> /tmp/results.csv # comm command is used as a set subtractor operator (lsof_test minus lsof_test2)
mv /tmp/lsof_test2 /tmp/lsof_test
TIME=$((TIME+1))
sleep 0.9
done
}
# Calculate the number of new connections per minute
verdict () {
cat /tmp/results.csv | uniq > /tmp/results_for_verdict.csv
echo "Timestamp,New Procs" > /tmp/verdict.csv
while [[ $(cat /tmp/results_for_verdict.csv | wc -l) -gt 60 ]]; do
echo -n $(cat /tmp/results_for_verdict.csv | head -n 1 | awk -F, '{print $1}'), >> /tmp/verdict.csv
cat /tmp/results_for_verdict.csv | head -n 60 | awk -F, '{s+=$2} END {print s}' >> /tmp/verdict.csv
sed -n '61,$p' < /tmp/results_for_verdict.csv > /tmp/tmp_results_for_verdict.csv
mv /tmp/tmp_results_for_verdict.csv /tmp/results_for_verdict.csv
done
echo -n $(cat /tmp/results_for_verdict.csv | head -n 1 | awk -F, '{print $1}'), >> /tmp/verdict.csv
cat /tmp/results_for_verdict.csv | head -n 60 | awk -F, '{s+=$2} END {print s}' >> /tmp/verdict.csv
}
lsof_func
verdict
#cleanup
rm /tmp/lsof_test
#rm /tmp/lsof_test2
rm /tmp/results.csv
rm /tmp/results_for_verdict.csv
Как я могу сделать итерации функции lsof_func более последовательными / работать быстрее и собирать эти данные каждую секунду?