Kann ich den effektiven Prozessnamen eines Python= - Skripts ändern? Ich möchte einen anderen Namen anstelle des tatsächlichen Namens des Prozesses anzeigen, wenn ich die Systemprozessliste erhalte. In C kann ich festlegen
strcpy(argv[0],"othername");
Aber in Python
argv[0] = "othername"
scheint nicht zu funktionieren. Wenn ich eine Prozessliste bekomme (mit ps ax
in meiner linux box) ändert sich der wirkliche name nicht. Ich bevorzuge eine tragbare Lösung (oder eine Lösung für Posix und eine andere für Windows-Umgebungen), falls vorhanden.
Danke im Voraus
Einfach ausgedrückt, es gibt keinen tragbaren Weg. Sie müssen das System testen und die bevorzugte Methode für dieses System verwenden.
Außerdem bin ich verwirrt darüber, was Sie mit Prozessnamen unter Windows meinen.
Meinen Sie einen Servicenamen? Das nehme ich an, weil sonst nichts wirklich Sinn ergibt (zumindest für mein Nicht-Windows-Gehirn).
In diesem Fall müssen Sie Tim Goldens WMI-Schnittstelle verwenden und die .Change-Methode für den Dienst aufrufen ... zumindest gemäß Tutorial .
Für Linux funktionierte keine der Methoden, die ich gefunden habe, außer dieses schlecht gepackte Modul , das argv [0] für Sie setzt.
Ich weiß nicht einmal, ob dies bei BSD-Varianten (die einen setproctitle-Systemaufruf haben) funktioniert. Ich bin mir ziemlich sicher, dass argv [0] unter Solaris nicht funktioniert.
Ich habe kürzlich ein Python Modul geschrieben, um den Prozesstitel portabel zu ändern: check https://github.com/dvarrazzo/py-setproctitle
Es ist ein Wrapper um den Code, mit dem PostgreSQL die Titeländerung durchführt. Derzeit wird es unter Linux und Mac OS X getestet: Windows (mit eingeschränkter Funktionalität) und BSD-Portierungen sind in Vorbereitung.
Edit: Seit Juli 2010 arbeitet das Modul mit BSD und mit eingeschränkter Funktionalität unter Windows und wurde nach Python 3 portiert .x.
eigentlich brauchst du 2 dinge unter linux: modify argv[0]
von C
(für ps auxf
und Freunde) und rufen prctl
mit PR_SET_NAME
Flagge.
Es gibt absolut keine Möglichkeit, das erste Stück von python selbst aus zu machen. Sie können den Prozessnamen jedoch einfach ändern, indem Sie prctl aufrufen.
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
zeigt danach nur noch 'python' an :(. Aber top
und ps -A
zeigt den neuen Prozessnamen 'testing yeah' an :). Auch killall
und pkill
funktionieren mit neuem Namen.
übrigens ändert der Prozessname von Googlecode auch argv[0]
, also eben, ändert ps auxf
Ausgabe.
[~ # ~] update [~ # ~] : Die in dieser Antwort angegebene Lösung läuft unter FreeBSD manchmal nicht unter Nice. Ich verwende jetzt py-setproctitle angegeben in dieser Antwort für ein Jahr oder so auf verschiedenen Linux- und Freebsd-Boxen. Nein, bisher fehlgeschlagen! Jeder sollte auch! :). Es verwendet fast den gleichen Code wie PostgreSQLverwendet in der Hauptdatenbank und den untergeordneten Prozessen.
Schauen Sie sich das Paket setproctitle an
Dies ist eine ziemlich portable Version und funktioniert auf vielen Plattformen.
Erstens bin ich nicht sicher, dass einfach Einstellungen argv[0]
in einem C-Programm ändert portabel den in ps
angezeigten Namen. Vielleicht funktioniert es in einigen Unixen, aber ich verstehe, dass es nicht erwartet wird.
Zweitens sind, da Windows speziell nicht POSIX-kompatibel ist, nur wenige Dinge zwischen POSIX und Nicht-POSIX "portierbar". Da Sie speziell 'ps' sagen, gehe ich davon aus, dass POSIX Ihre Priorität ist und Windows möglicherweise nicht funktioniert.
Noch wichtiger ist, mein Verständnis der Veränderung argv[0]
erfordert einen Aufruf von exec
, um diese Änderungen vorzunehmen. Insbesondere hat der Aufruf von exec
sowohl einen Pfad zu einer ausführbaren Datei als auch eine separate Liste von argv
. Wenn Sie Ihren eigenen Anruf tätigen, können Sie die Shell-Konvention brechen, den Namen der ausführbaren Datei in argv[0]
.
Sie haben OS Library Process Management , mit dem Sie direkt auf die OS Library zugreifen können. Sie sollten überlegen, Ihr Skript in zwei Teile zu unterteilen - einen Starter und die "echte Arbeit". Der Starter legt die Laufzeitumgebung fest und führt die eigentliche Arbeit mit den gewünschten Parametern aus.
In C ersetzen Sie Ihren eigenen Prozess durch einen anderen. In Python ersetzen Sie den alten Python) -Interpreter durch einen neuen mit einem anderen argv [0]. Hoffentlich wird dies nicht verhindert. Einige Programme überprüfen argv [0]. zu entscheiden, was sie tun.
Sie haben auch subprocess.popen , mit dem Sie die gewünschten Argumente und ausführbaren Dateien festlegen können. In diesem Fall sollte der übergeordnete Prozess jedoch verweilen, um das untergeordnete Element zu sammeln, wenn das untergeordnete Element fertig ist. Der Elternteil darf nicht mehr als ein Popen.wait
Meine Antwort auf eine ähnliche Frage markiert als Duplikat :
Es ist einfacher (Sie brauchen keine Bibliotheken zu importieren), aber vielleicht nicht so elegant. Sie müssen "env" nicht innerhalb der Shebang-Zeile verwenden.
Mit anderen Worten, dies wird in der Prozessliste als "Python" bezeichnet:
#!/usr/bin/env python
Dies wird jedoch mit Ihrem Skriptnamen benannt:
#!/usr/bin/python
So finden Sie es mit etwas wie pidof -x scriptname
oder ps -C scriptname
Ich habe festgestellt, dass python-prctl unter Linux sehr gut funktioniert. Sie müssen etwas anderes für Windows finden.