В каком порядке отображается «/proc/net/tcp»

Es difícil depurar un fragmento de código sin saber qué datos contiene. Por lo tanto, me abstendré de especular sobre lo que podría estar mal con su código, además de decir que ^$ACCTprobablemente debería estar entre comillas dobles, al igual que todas las demás apariciones de $ACCT.


En lugar de llamar a zgrepuna vez por cada línea enaccount_list.txt(y descomprimir esos archivos de datos tantas veces como líneas haya en ese archivo ), lea las cuentas en una matriz en awky realice el procesamiento en una sola pasada:

awk 'NR==FNR { acct[$1]; next }
     $1 in acct { file="/tmp/" $1 ".txt"; print >>file; close(file) }' \
    account_list.txt <( zcat datafile.0[2-3]2015.gz )

Esto supone basho algún otro shell que comprenda las sustituciones de procesos. También se supone que la lista de cuentas contiene el nombre de la cuenta en la primera columna y que los archivos de datos también contienen el nombre de la cuenta en la primera columna (en realidad no ha mostrado cómo se ven estos archivos, así que no puedo decir si esto funcionaría o no ).

El primer bloque awksolo se ejecuta para el primer archivo, account_list.txt, y creará una matriz asociativa, acct, con los nombres de cuenta para extraer como claves.

El segundo bloque solo se ejecuta sobre las líneas de los archivos de datos extraídos, y si el primer campo corresponde a una clave en acct, esa línea se imprime en un archivo con el nombre adecuado.

1
10.06.2019, 15:44
1 ответ

Как описано в этом файле документации ядра, , фактический код, который создает листинг, находится в исходном файле ядра Linux.../net/ipv4/tcp _ipv4.c . В файле документации сказано, что сначала перечислены все прослушиваемые сокеты, а затем уже установленные соединения.

Никакой дальнейшей сортировки не обещают. Таким образом, точный порядок (или не-порядок )может измениться, если/когда хранилище состояний сокетов TCP в ядре будет переопределено, или, другими словами, разные версии ядра могут делать вещи совершенно по-разному.

Кажется, есть четыре основные функции, связанные с/proc/net/tcp:

  • tcp4_seq_start()запускает итератор для обхода структур данных TCP ядра
  • tcp4_seq_show()переводит текущую запись в строку текста,с помощью различных вспомогательных функций -
  • tcp4_seq_next()находит следующую запись данных
  • tcp4_seq_stop()очищает итератор после закрытия файла или завершения листинга.

Структуры данных ядра, из которых сгенерирован листинг , являются фактическими структурами данных, используемыми для обработки соответствующих TCP-соединений , так что в определенном смысле можно сказать, что действие процесса, выполняющего listen()или системный вызов connect()вызывает вставку записи. Отдельного шага «обновить /proc/net/tcp» нигде нет.

4
27.01.2020, 23:18

Теги

Похожие вопросы