2010-10-06 1 views
1

Dans linux, je peux utiliser lsof -i comme dans la fonction suivante:En python, existe-t-il une méthode multi-plateforme pour déterminer quel processus écoute un port donné?

def FindProcessUsingPort(portnum): 
    import os 
    fp = os.popen("lsof -i :%s" % portnum) 
    lines = fp.readlines() 
    fp.close() 
    pid = None 
    if len(lines) >= 2: 
     pid = int(lines[1].split()[1]) 
    return pid 

est-il un moyen multi-plateforme pour comprendre cela? Comme référence pertinente, une fois que je connais l'identificateur de processus, la bibliothèque psutil est très agréable et me permet de déterminer toutes sortes d'informations de processus utiles pour cela de manière multiplateforme. Je ne peux pas obtenir la première partie pour travailler (trouver le pid) multi-plateforme pour le moment.


Si pas familier avec le commutateur lsof -i, la sortie ressemble ci-dessous (après le lancement d'un processus de python qui ouvre une socket TCP écoute sur le port 1234):

 
$ lsof -i :1234 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
python 22380 russ 15u IPv4 4015476  0t0 TCP *:1234 (LISTEN) 
+2

voir: http://stackoverflow.com/questions/ 15708/lsof-equivalent-for-windows. Ils parlent de fichiers, mais il est peu probable que cela soit plus facile pour les ports. – tokland

+1

@tokland: merci. Mais je cherche un moyen qui ne nécessite pas l'installation de paquets non-python spécifiques à l'os. Je suis d'accord qu'il pourrait être improbable sur Windows, mais je devais encore demander. +1 de toute façon pour un lien vers quelque chose qui fait référence aux sysinternals ... quand dans Windows ces outils sont indispensables. – Russ

Répondre

2

non, cela ne se construit pas en PYT hon.

2

Cette réponse est plus d'un tangente à votre question, mais si vous pouvez trouver des moyens spécifiques à l'OS, mais rien strictement portable, je voudrais faire de votre module, comme suit

def find_port_owner_windows(p): 
    doit() 

def find_port_owner_linux(p): 
    doit2() 

port_finders = {'nt': find_port_owner_windows, 
       'posix': find_port_owner_linux} 

try: 
    find_port_owner = port_finders[os.name] 
except KeyError: 
    raise RuntimeError("No known port finder for your OS (%s)" % os.name) 
+0

Certainement une tangente, mais merci! Je suis à la recherche d'une méthode multiplateforme, où la solution n'est de préférence pas de savoir comment le faire dans chacune des plates-formes et d'envoyer un appel dans votre code basé sur os.name ou sys.platform ". Bien que si c'est tout ce qui est disponible, alors ça va. – Russ

+0

Parfois, c'est vraiment la réponse, cependant. Comme dans ce cas, par exemple. – SamB

2

Comme Daenyth's anwer, cela ne répond pas précisément à la question que vous avez posée, mais je pense que vous trouverez probablement cela utile étant donné que la réponse à cette question semble être "vous ne pouvez pas".

Eh bien, NT de netstat.exe peut ne pas être aussi capable que cela, mais il peut au moins faire:

C:\Documents and Settings\Sam\My Documents>netstat -o -b -n 

Active Connections 

    Proto Local Address   Foreign Address  State   PID 
    TCP 127.0.0.1:1083   127.0.0.1:6000   ESTABLISHED  3716 
    [Xming.exe] 

    TCP 127.0.0.1:1084   127.0.0.1:6000   ESTABLISHED  3716 
    [Xming.exe] 

    TCP 127.0.0.1:1085   127.0.0.1:6000   ESTABLISHED  3716 
    [Xming.exe] 

    TCP 127.0.0.1:1214   127.0.0.1:9481   ESTABLISHED  236 
    Can not obtain ownership information 
    TCP 127.0.0.1:1231   127.0.0.1:31416  ESTABLISHED  2764 
    [boincmgr.exe] 

    TCP 127.0.0.1:3814   127.0.0.1:6000   ESTABLISHED  716 
    [putty.exe] 

« Impossible d'obtenir des informations de propriété » lignes sont parce que je ne suis pas en cours d'exécution cela comme un administrateur, donc (comme sur Linux) je ne peux vraiment voir cette information que pour mes propres processus. (Je suis probablement autorisé à le faire pour tout processus dont l'ACL m'accorde l'accès nécessaire, mais en pratique cela signifie essentiellement la même chose que "mes processus" pour les utilisateurs non-administrateurs.)

La version exacte de netstat.exe, tel que copié à partir de la boîte de dialogue Propriétés de l'explorateur, est "5.1.2600.5512 (xpsp.080413-0852)". Il se trouve que je cours XP SP3, mais je ne suis pas sûr quand ce fichier a été mis à jour pour la dernière fois. (Oui, j'utilise un compte non administrateur sous XP, ce n'est pas aussi simple que cela devrait l'être, mais ce n'est pas aussi difficile qu'on pourrait le penser.)

Questions connexes