web-dev-qa-db-fra.com

Existe-t-il un moyen de changer le nom d'un processus efficace en Python?

Puis-je changer le nom de processus effectif d'un script Python? Je veux afficher un nom différent au lieu du vrai nom du processus lorsque j'obtiens la liste des processus système. En C, je peux définir

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

Mais en Python

argv[0] = "othername"

ne semble pas fonctionner. Quand j'obtiens la liste des processus (avec ps ax dans ma boîte Linux) le vrai nom 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

72
Emilio

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

De plus, je ne comprends pas ce que vous entendez par noms de processus sous Windows.

Voulez-vous dire un nom de service? Je suppose que oui, car rien d'autre n'a vraiment de sens (au moins pour mon cerveau non Windows).

Si c'est le cas, vous devez utiliser l'interface WMI de Tim Golden et appeler la méthode .Change sur le service ... au moins selon son tutoriel .

Pour Linux, aucune des méthodes que j'ai trouvées n'a fonctionné, sauf pour ce module mal emballé qui définit argv [0] pour vous.

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

13
Van Gale

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

Il s'agit d'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 les portages BSD sont en cours.

Edit: à 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.

81
piro

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

Il n'y a absolument aucun moyen de faire le premier morceau depuis python lui-même. Bien que, 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 affichera juste 'python' après cela :(. Mais top et ps -A affichera le nouveau nom du processus 'testing yeah' :). killall et pkill fonctionneront également avec un nouveau nom.

btw, procname de googlecode change également argv[0], donc, même, change ps auxf sortie.

[~ # ~] mise à jour [~ # ~] : La solution publiée dans cette réponse ne joue pas parfois Nice sur FreeBSD. J'utilise maintenant py-setproctitle indiqué dans cette réponse pendant environ un an sur diverses boîtes Linux et FreeBSD. Aucun échec jusqu'à présent! Tout le monde devrait aussi! :). Il utilise presque le même code que PostgreSQLtilise dans sa base de données principale et ses processus enfants.

51
Vadim Fint

Jetez un oeil sur setproctitle package

Il s'agit d'une version assez portable et fonctionne sur de nombreuses plates-formes.

7
valgog

Tout d'abord, je ne suis pas sûr que les paramètres simplement argv[0] dans un programme C modifie de manière portable le nom affiché dans ps. Peut-être que c'est le cas dans certains Unixen, mais je crois comprendre que ce n'est pas prévu.

Deuxièmement, étant donné que Windows n'est pas spécifiquement conforme à POSIX, seules quelques éléments sont "portables" entre POSIX et non-POSIX. Puisque vous dites spécifiquement "ps", je suppose que POSIX est votre priorité et Windows peut ne pas fonctionner.

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

Vous avez gestion du processus de la 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 - un démarreur et le "vrai travail". Le démarreur établit l'environnement d'exécution et exécute le vrai travail avec les paramètres souhaités.

En C, vous remplacez votre propre processus par un autre. En Python, vous remplacez l'ancien interpréteur Python par un nouveau qui a un argv [0] différent. Avec un peu de chance, il ne rechignera pas. 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 les arguments et l'exécutable souhaités. Dans ce cas, cependant, le processus parent doit s'attarder pour récupérer l'enfant lorsque l'enfant a terminé. Le parent ne fait peut-être rien de plus qu'un Popen.wait

4
S.Lott

Ma réponse à une question similaire marquée comme en double :

Il y a plus simple (vous n'avez pas besoin d'importer de bibliothèques) mais peut-être pas de manière aussi élégante. Vous ne devez pas utiliser "env" à l'intérieur de la ligne Shebang.

En d'autres termes, cela sera nommé "python" dans la liste des processus:

#!/usr/bin/env python

Mais cela sera nommé avec votre nom de script:

#!/usr/bin/python

Vous pourrez donc le trouver avec quelque chose comme pidof -x scriptname ou ps -C scriptname

3
Sasha Ru

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

2
Vukasin Toroman