GNU/Linux >> Tutoriels Linux >  >> Linux

Comment déterminer le temps de connexion du socket sous Linux

Vous pouvez essayer ce qui suit :

  1. obtenir le PID (dire $pid ) du programme en ajoutant le -p option à netstat .

  2. identifier la bonne ligne dans le /proc/net/tcp fichier en regardant le local_address et/ou rem_address champs (notez qu'ils sont au format hexadécimal, en particulier l'adresse IP est exprimée dans l'ordre des octets little-endian), assurez-vous également que le st est 01 (pour ESTABLISHED );

  3. notez le inode associé champ (par exemple $inode );

  4. rechercher ce inode parmi les descripteurs de fichiers en /proc/$pid/fd et enfin interroger le temps d'accès au fichier du lien symbolique :

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

C'est un travail fastidieux ... voici un script (stub) pour automatiser les points ci-dessus, il nécessite l'adresse distante et imprime le temps de disponibilité du socket en secondes :

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 %[email protected])
    [ -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")
}

(Edit merci à Alex pour les correctifs)

Exemple :

$ suptime 93.184.216.34 80
Thu Dec 24 16:22:58 CET 2015 (46.12s ago)

Cette question m'a été utile, mais j'ai trouvé en utilisant lsof au lieu de netstat laissez-moi éviter tous les trucs HEX :

Pour un processus ${APP} exécuté par l'utilisateur ${USER} , ce qui suit renvoie tous les sockets ouverts à l'adresse 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

Le lsof contient le PID aussi, mais je ne sais pas comment l'obtenir et le numéro de l'appareil.

Cela a été testé sur Amazon Linux.


Le script de cYrus a fonctionné pour moi mais j'ai dû le corriger un peu (pour me débarrasser d'un "L" dans l'adresse hexadécimale et faire du port un hexadécimal à 4 chiffres) :

--- 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 %[email protected])
     LANG=C printf '%.2fs' $(bc <<<"$(date +%s.%N) - $time")

Linux
  1. Comment obtenir l'heure de début d'un processus Linux de longue durée ?

  2. Comment trouver la taille du tampon de socket de Linux

  3. Comment le noyau Linux détermine-t-il l'ordre des appels __init ?

  4. Comment rediriger la sortie de la commande time vers un fichier sous Linux ?

  5. Comment supprimer une connexion de socket CLOSE_WAIT

Comment définir ou modifier le fuseau horaire sous Linux

Vérifier le fuseau horaire sous Linux

Comprendre la commande time sous Linux

Comment déterminer ce qui utilise le plus d'espace disque sur un serveur Linux ?

Comment convertir les caractères hexadécimaux en caractères ASCII dans le shell Linux ?

Comment envoyer un message à mon websocket socket.io à partir de la ligne de commande sous Linux ?