Question

Puis-je changer le nom du processus efficace d'un script Python? Je veux montrer un nom différent au lieu du nom du processus lorsque je reçois la liste des processus du système. En C, je peux définir

strcpy(argv[0],"othername");

Mais en Python

argv[0] = "othername"

ne semble pas fonctionner. Quand je reçois la liste des processus (avec ps ax dans ma boîte de linux) le nom réel ne change pas. Je préfère une solution portable (ou bien une solution pour posix et une autre pour les environnements Windows), si elle existe.

Merci d'avance

Était-ce utile?

La solution

Il suffit de mettre, il n'y a aucun moyen portable. Vous devrez tester le système et utiliser la méthode préférée pour ce système.

De plus, je suis confus au sujet de ce que vous entendez par des noms de processus sous Windows.

Voulez-vous dire un nom de service? Je présume, parce que rien d'autre fait vraiment de sens (au moins à mon cerveau à l'aide non-Windows).

Si oui, vous devez utiliser Tim Interface WMI d'or et appeler la méthode .Modification sur le service ... au moins selon son tutoriel .

Pour Linux aucune des méthodes que j'ai fait fonctionner à l'exception ce module mal emballé ensembles argv [0] pour vous.

Je ne sais même pas si cela va fonctionner sur les variantes BSD (qui a un appel système setproctitle). Je suis assez sûr argv [0] ne fonctionnera pas sur Solaris.

Autres conseils

J'ai récemment écrit un module Python pour changer le titre du processus de manière portable: consultez https: / /github.com/dvarrazzo/py-setproctitle

Il est un wrapper autour du code utilisé par PostgreSQL pour effectuer le changement de titre. Il est actuellement testé contre Linux et Mac OS X:. (Windows avec des fonctionnalités limitées) et BSD sont portages sur le chemin

Modifier à partir de Juillet 2010, le module fonctionne avec BSD et avec des fonctionnalités limitées sur Windows, et a été porté sur Python 3.x

.

en fait, vous avez besoin de 2 choses sur linux: modifier argv[0] de C (pour ps auxf et amis) et appelez prctl avec le drapeau de PR_SET_NAME

.

Il n'y a absolument aucun moyen de faire en premier morceau de python lui-même. Bien, vous pouvez simplement changer le nom du processus en appelant prctl.

def set_proc_name(newname):
    from ctypes import cdll, byref, create_string_buffer
    libc = cdll.LoadLibrary('libc.so.6')
    buff = create_string_buffer(len(newname)+1)
    buff.value = newname
    libc.prctl(15, byref(buff), 0, 0, 0)

def get_proc_name():
    from ctypes import cdll, byref, create_string_buffer
    libc = cdll.LoadLibrary('libc.so.6')
    buff = create_string_buffer(128)
    # 16 == PR_GET_NAME from <linux/prctl.h>
    libc.prctl(16, byref(buff), 0, 0, 0)
    return buff.value

import sys
# sys.argv[0] == 'python'

# outputs 'python'
get_proc_name()

set_proc_name('testing yeah')

# outputs 'testing yeah'
get_proc_name()

ps auxf montrera juste « python » après :(. Mais top et ps -A montrera le nouveau nom de processus «test ouais :). killall aussi et pkill travaillera avec le nouveau nom.

BTW, procname de googlecode change aussi argv[0], donc, même, change ps auxf sortie.

UPDATE : La solution affichée dans cette réponse ne joue pas bien parfois sur FreeBSD. J'utilise maintenant py-setproctitle dit in cette réponse pour un an ou sur divers linux et des boîtes. freebsd échoue pas jusqu'à présent! Tout le monde devrait aussi! :). Il utilise presque le même code que PostgreSQL utilise dans sa base de données principales et les processus enfants

Jetez un coup d'oeil sur l'emballage setproctitle

Ceci est tout à fait une version portable et fonctionne sur de nombreuses plates-formes.

D'abord, je ne suis pas sûr que les paramètres simplement argv[0] dans un programme C change portably le nom affiché dans ps. Peut-être qu'il fait dans certains versions d'Unix, mais je crois comprendre que cela ne devrait.

En second lieu, puisque Windows est spécifiquement non conforme POSIX, quelques choses sont « portables » entre Posix et non POSIX. Puisque vous dites spécifiquement « ps », je suppose que votre priorité est Posix et Windows ne fonctionne pas.

Plus important encore, ma compréhension de l'évolution argv[0] est qu'il nécessite un appel à exec pour faire ces changements. Plus précisément, l'appel exec a à la fois un chemin d'accès à un fichier exécutable et une liste de argv séparée. Faire votre propre appel vous permet de rompre la convention shell de mettre le nom de l'exécutable dans argv[0].

Vous avez la gestion des processus bibliothèque OS qui vous donne un accès direct à la bibliothèque OS pour ce faire. Vous devriez envisager de diviser votre script en deux parties - une entrée et le « vrai travail ». Le démarreur établit l'environnement d'exécution et exec est le vrai travail avec les paramètres souhaités.

En C, vous remplacez votre propre processus avec un autre. En Python, vous remplacez l'ancien interpréteur Python avec une nouvelle qui a un autre argv [0]. Si tout va bien, il ne rechignent à cela. Certains programmes vérifient argv [0] pour décider ce qu'ils font.

Vous avez également subprocess.Popen que vous pouvez utiliser pour définir vos args souhaités et exécutable. Dans ce cas, cependant, le processus parent doit se dissipe autour de recueillir l'enfant lorsque l'enfant se termine. Le parent ne peut pas être fait quelque chose de plus qu'un Popen.wait

Ma réponse à la même question marquée comme double :

Il est plus simple (vous n'avez pas besoin d'importer des libs), mais peut-être pas si façon élégante. Vous devez faire à l'intérieur de la ligne de tralala pas utiliser « env ».

En d'autres termes, il sera nommé comme « python » dans la liste des processus:

#!/usr/bin/env python

Mais ce sera nommé avec votre scriptname:

#!/usr/bin/python

Alors, vous serez en mesure de le trouver avec quelque chose comme pidof -x scriptname ou ps -C scriptname

J'ai trouvé python-prctl fonctionne très bien sous Linux. Vous devrez trouver quelque chose d'autre pour Windows.

In [1]: import sys

In [2]: print sys.argv[0]
C:\Python25\scripts\ipython.py

In [3]: sys.argv[0] = 'foo'

In [4]: print sys.argv[0]
foo

Notez le signe unique '='

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top