7
votes

Trouver la commande pour un PID spécifique à Linux de Python

J'aimerais savoir s'il est possible de découvrir la "commande" qu'un PID est réglé sur. Lorsque je dis commandement, je veux dire ce que vous voyez dans la dernière colonne lorsque vous exécutez la commande "TOP" dans une coque Linux. J'aimerais avoir cette information de Python en quelque sorte lorsque j'ai une PID spécifique.

Toute aide serait formidable. Merci.


0 commentaires

7 Réponses :


6
votes

Lire sur le PS code> commande et analyser sa sortie.

ps -p [PID] -o cmd 


0 commentaires

0
votes

Le système de fichiers PRO exporte cette (et d'autres) informations. Regardez le / proc / pid / cmd Symlink.


0 commentaires

7
votes

regarder dans / proc / $ pid / cmdline


0 commentaires

11
votes

S'il vous plaît, n'utilisez pas / proc du système de fichiers dans le code de production. Au lieu de cela, utilisez des interfaces POSIX bien définies, telles que des appels GLIBC et des commandes Standard Shell! Rendre le monde Linux plus standardisé, il a vraiment besoin de!

Ce dont vous avez besoin est bien obtenu en appelant une commande shell xxx p> aucune analyse n'est nécessaire!

Sans seule que lire la sortie de la commande de shell de Python ne prend plus d'effort que de lire à partir d'un fichier dans / proc . Et cela rend votre programme plus portable, soit!


7 commentaires

Toutes sortes de vrai, mais la question était pour Linux, nous avons donc répondu à la question actuelle et je pense que la plupart d'entre nous ont fait l'hypothèse qu'il connaissait sur ps (1) .


@DigitalRoss: alors la question ressemblerait à "où ps prend des informations de ligne de commande de?"


Peu trop prétentieux pour moi.


PS fonctionne en lisant les fichiers virtuels dans / proc. Voilà pour l'interface POSIX bien définie (laquelle était celle qui, de toute façon?).


Écoutez, je vous aurais marqué à la fois comme des réponses correctes mais je ne pouvais pas. La réponse de Pavel semblait juste être plus de ce que je cherchais, mais la réponse donnée pour DigitalRoss était super aussi. Upvotes pour les deux.


@Nick Stinemates, @Michael Foukarakis. Hey, je sais comment fonctionne PS fonctionne (oui, il lit en effet des fichiers dans / proc ). Mais lorsque au lieu de / proc , ils vont inventer le système / foobar , vous devrez réécrire votre programme. Quoi qu'il en soit, peut-être que j'ai été cervoyé en travaillant dans le groupe de travail de LSB, mais vous devez vraiment vous en tenir à des normes où cela vous suffit - ce qui est le cas à l'étude.


Cette commande émettra la ligne de commande arguments, mais les séparez avec des espaces. Si vous essayez de revenir aux arguments dans une liste des chaînes, vous ne pourrez pas différencier entre arguments et arguments avec des espaces. (Que vous peut faire avec / proc / $ pid / cmdline )



5
votes

regarder dans / proc / $ pid / cmdline , puis os.readlink () sur / proc / $ pid / exe . .

/ proc / $ pid / cmdline ne sera pas nécessairement correct, car programme peut modifier son vecteur d'argument ou ne contenir pas de chemin complet. Trois exemples de ma liste de processus actuels sont les suivants:

  • Avahi-Daemon: Helper Chroot
  • qmgr -l -tfoo -u
  • / usr / sbin / postgrey --pidfile = / var / exécuté / postgrey.pid --Daemonize --net = 127.0.0.1: 60000 --Delay = 55

    Ce premier est évident - ce n'est pas un chemin ou un nom de programme valide. La seconde n'est qu'un exécutable sans nom de chemin. Le troisième semble correct, mais cette ligne de commande entière est en fait dans argv [0] , avec des espaces séparant les arguments. Normalement, vous devriez avoir des arguments séparés nul.

    Tout cela va montrer que / proc / $ pid / cmdline (ou la sortie PS (1)) n'est pas fiable.

    Cependant, et n'est pas / proc / $ pid / exe . Habituellement, il s'agit d'un lien symbolique de l'exécutable qui est le principal segment de texte du processus. Mais parfois, il a " (supprimé) " après elle si l'exécutable n'est plus dans le système de fichiers.

    En outre, le programme qui est le segment de texte n'est pas toujours ce que vous voulez. Par exemple, / proc / $ pid / exe à partir de celui-ci / usr / sbin / postgrey exemple ci-dessus est / usr / bin / perl . Ce sera le cas pour tous les scripts interprétés (#!).

    J'ai réglé sur l'analyse / proc / € pid / cmdline - Prenant le premier élément du vecteur, puis à la recherche d'espaces dans cela et en prenant tout avant le premier espace. Si c'était un fichier exécutable - je me suis arrêté là-bas. Sinon, j'ai fait un LIVELINK (2) sur / PID / $ PID / EXE et supprimé tout " (supprimé) " Strings à la fin. Cette première partie échouera si le nom de fichier exécutable dispose d'espaces. Il n'y a pas grand chose que vous pouvez faire à ce sujet.

    BTW. L'argument à utiliser PS (1) au lieu de / PID / $ PID / CMDLINE ne s'applique pas dans ce cas, car vous allez revenir à / PROC / $ PID / EXE < / code>. Vous dépendez du système de fichiers / proc , de sorte que vous le permettez de la lecture (2) au lieu de tuyau (2), de la fourchette (2), de l'exécution (2), de readdir (3). ..., écrire (2), lire (2). Tandis que PS et / PROC / $ PID / CMDLINE peut être identique du point de vue des lignes de code Python, il y a beaucoup plus de choses sur les scènes avec PS.


1 commentaires

Grande rédaction. Merci pour cela, Camh.



5
votes

Un package Python intéressant est Psutil .

Par exemple, pour obtenir la commande pour obtenir la commande Un PID spécifique: P>

import psutil
pid = 1234 # The pid whose info you're looking for
if pid in psutil.get_pid_list():
    p = psutil.Process(pid)
    print p.cmdline


1 commentaires

Je sais déjà comment obtenir ces informations de Linux. Félicitations pour avoir réellement obtenu "cette information de Python"! Vous gagnez mon vote.



0
votes

Cela a fonctionné pour moi:

def filter_non_printable(str):
    ret=""
    for c in str:
        if ord(c) > 31 or ord(c) == 9:
            ret += c
        else:
            ret += " "
    return ret


#
# Get /proc/<cpu>/cmdline information
#
def pid_name(pid):
    try:
        with open(os.path.join('/proc/', pid, 'cmdline'), 'r') as pidfile:
            return filter_non_printable(pidfile.readline())

    except Exception:
        pass
        return


0 commentaires