Como determinar o tempo de conexão da conexão do soquete no Linux

18

Eu posso verificar se a conexão está ativa:

$ netstat -tn | grep "192.168.2.110"
tcp  0  0 192.168.2.100:10444  192.168.2.110:52639  ESTABLISHED

existe uma maneira de verificar quanto tempo esta conexão de porta tcp estava ativa (conectada)?

(Não, eu não tenho acesso aos registros de aplicativos)

    
por hidralisk 14.03.2013 / 18:59

5 respostas

12

Você pode tentar o seguinte:

  1. obtenha o PID (digamos, $pid ) do programa adicionando a opção -p a netstat .

  2. identifique a linha apropriada no arquivo /proc/net/tcp observando os campos local_address e / ou rem_address (observe que eles estão no formato hexadecimal, especificamente o endereço IP é expresso em byte little-endian ordem), certifique-se também de que st é 01 (para ESTABLISHED );

  3. observe o campo inode associado (digamos $inode );

  4. pesquise por inode entre os descritores de arquivo em /proc/$pid/fd e finalmente consulte o tempo de acesso ao arquivo do link simbólico:

    find /proc/$pid/fd -lname "socket:\[$inode\]" -printf %t
    

Esse é um trabalho duro ... aqui está um script (stub) para automatizar os pontos acima, ele requer o endereço remoto e imprime o tempo de ativação do soquete em segundos:

function suptime() {
    local addr=${1:?Specify the remote IPv4 address}
    local port=${2:?Specify the remote port number}
    # convert the provided address to hex format
    local hex_addr=$(python -c "import socket, struct; print(hex(struct.unpack('<L', socket.inet_aton('$addr'))[0])[2:10].upper().zfill(8))")
    local hex_port=$(python -c "print(hex($port)[2:].upper().zfill(4))")
    # get the PID of the owner process
    local pid=$(netstat -ntp 2>/dev/null | awk '$6 == "ESTABLISHED" && $5 == "'$addr:$port'"{sub("/.*", "", $7); print $7}')
    [ -z "$pid" ] && { echo 'Address does not match' 2>&1; return 1; }
    # get the inode of the socket
    local inode=$(awk '$4 == "01" && $3 == "'$hex_addr:$hex_port'" {print $10}' /proc/net/tcp)
    [ -z "$inode" ] && { echo 'Cannot lookup the socket' 2>&1; return 1; }
    # query the inode status change time
    local timestamp=$(find /proc/$pid/fd -lname "socket:\[$inode\]" -printf %T@)
    [ -z "$timestamp" ] && { echo 'Cannot fetch the timestamp' 2>&1; return 1; }
    # compute the time difference
    LANG=C printf '%s (%.2fs ago)\n' "$(date -d @$timestamp)" $(bc <<<"$(date +%s.%N) - $timestamp")
}

(Editar graças a Alex pelo fixes )

Exemplo:

$ suptime 93.184.216.34 80
Thu Dec 24 16:22:58 CET 2015 (46.12s ago)
    
por 15.06.2015 / 02:12
3

Estas perguntas foram úteis para mim, mas eu achei usando lsof ao invés de netstat , deixe-me evitar todas as coisas HEX:

Para um processo ${APP} executado pelo usuário ${USER} , o seguinte retorna todos os sockets abertos para o endereço IP $ {IP}:

PEEID=$(sudo pgrep -u ${USER} ${APP}) && for i in 'sudo lsof -anP -i -u logstash | grep ${IP} | awk '{print $6}'' ; do echo "${device} time" ; sudo find /proc/${PEEID}/fd -lname "socket:\[${device}\]" -printf %t 2> /dev/null  ; echo  ;  done

O lsof contém o PID também, mas não sei como obtê-lo e o número do dispositivo.

Isso foi testado no Amazon Linux.

    
por 08.06.2016 / 19:50
2

O script do cYrus funcionou para mim, mas eu tive que consertar um pouco (para me livrar de um "L" no endereço hexadecimal e fazer da porta um hexadecimal de 4 dígitos):

--- suptime.orig    2015-08-20 15:46:12.896652464 +0200
+++ suptime 2015-08-20 15:47:48.560074728 +0200
@@ -7,8 +7,8 @@
     hex_addr=$(python -c "
 import socket, struct;
 print hex(struct.unpack('<L',
-socket.inet_aton('$addr'))[0])[2:].upper().zfill(8)")
-    hex_port=$(python -c "print hex($port)[2:].upper()")
+socket.inet_aton('$addr'))[0])[2:10].upper().zfill(8)")
+    hex_port=$(python -c "print hex($port)[2:].upper().zfill(4)")
     inode=$(awk '$3 == "'$hex_addr:$hex_port'" {print $10}' /proc/net/tcp)
     time=$(find /proc/$pid/fd -lname "socket:\[$inode\]" -printf %A@)
     LANG=C printf '%.2fs' $(bc <<<"$(date +%s.%N) - $time")
    
por 20.08.2015 / 15:57
0

Que tal:

lsof -t -i @192.168.2.110 | xargs ps -fp

Você também pode personalizar o comando "ps" para obter apenas o pid e iniciar a hora com -o como:

lsof -t -i @192.168.2.110 | xargs ps --no-headers -o'pid,start' -p

É claro que isso pressupõe que o soquete foi iniciado quando o processo ocorreu.

    
por 23.06.2017 / 19:32
-1

Eu não vi netstat dar essa informação. Uma combinação dos comandos netstat e ps deve ser útil.

  • Obtenha o pid do soquete com netstat .
$ sudo netstat -plan | grep "198.252.206.25"

tcp        0      0 192.168.0.14:41558      198.252.206.25:80       ESTABLISHED 2679/chromium-brows
  • Verifique os detalhes do processo com ps .
$ sudo ps -eo uid,pid,etime | grep 2679

UID   PID     ELAPSED
1000  2679       44:31

O terceiro valor aqui é o tempo total que o soquete está sendo executado.

Para entender melhor a saída ps , estou colando os títulos.

$  sudo ps -eo uid,pid,etime | head

UID   PID     ELAPSED
0     1       52:37
    
por 14.03.2013 / 19:57

Tags