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. P>
Toute aide serait formidable. Merci. P>
7 Réponses :
Le système de fichiers PRO exporte cette (et d'autres) informations. Regardez le / proc / pid / cmd Symlink. P>
/ proc / $ pid / cmdline code> h3>
S'il vous plaît, n'utilisez pas Ce dont vous avez besoin est bien obtenu en appelant une commande shell p> 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 code> 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!
/ proc code>. Et cela rend votre programme plus portable, soit! P> P>
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) code>.
@DigitalRoss: alors la question ressemblerait à "où ps code> 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 code>). Mais lorsque au lieu de
/ proc code>, ils vont inventer le système
/ foobar code>, 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 i> faire avec / proc / $ pid / cmdline code>)
regarder dans 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 Tout cela va montrer que Cependant, et n'est pas En outre, le programme qui est le segment de texte n'est pas toujours ce que vous voulez. Par exemple, J'ai réglé sur l'analyse BTW. L'argument à utiliser PS (1) au lieu de / proc / $ pid / cmdline code>, puis os.readlink () sur
/ proc / $ pid / exe code>. p>.
/ proc / $ pid / cmdline code> 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: P>
Avahi-Daemon: Helper Chroot Code> Li>
qmgr -l -tfoo -u code> li>
/ usr / sbin / postgrey --pidfile = / var / exécuté / postgrey.pid --Daemonize --net = 127.0.0.1: 60000 --Delay = 55 code> li> li> LI>
ul>
argv [0] code>, avec des espaces séparant les arguments. Normalement, vous devriez avoir des arguments séparés nul. P>
/ proc / $ pid / cmdline code> (ou la sortie PS (1)) n'est pas fiable. P>
/ proc / $ pid / exe code>. 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é) code>" après elle si l'exécutable n'est plus dans le système de fichiers. P>
/ proc / $ pid / exe code> à partir de celui-ci
/ usr / sbin / postgrey code> exemple ci-dessus est
/ usr / bin / perl code>. Ce sera le cas pour tous les scripts interprétés (#!). P>
/ proc / € pid / cmdline CODE> - 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 CODE> et supprimé tout "
(supprimé) code>" 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. P>
/ PID / $ PID / CMDLINE CODE> ne s'applique pas dans ce cas, car vous allez revenir à
/ PROC / $ PID / EXE < / code>. Vous dépendez du système de fichiers
/ proc code>, 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 CODE> 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. P>
Grande rédaction. Merci pour cela, Camh.
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
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.
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