bash скрипт для сбора новых сетевых сокетов за заданный период времени

Следующий код 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 более последовательными / работать быстрее и собирать эти данные каждую секунду?

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *