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
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.
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.
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.
Jetez un oeil sur setproctitle package
Il s'agit d'une version assez portable et fonctionne sur de nombreuses plates-formes.
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
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
J'ai trouvé que python-prctl fonctionnait très bien sous Linux. Vous devrez trouver autre chose pour Windows.