it-swarm.com.de

Gibt es eine Möglichkeit, den effektiven Prozessnamen in Python zu ändern?

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

72
Emilio

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.

13
Van Gale

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.

81
piro

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.

51
Vadim Fint

Schauen Sie sich das Paket setproctitle an

Dies ist eine ziemlich portable Version und funktioniert auf vielen Plattformen.

7
valgog

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

4
S.Lott

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

3
Sasha Ru

Ich habe festgestellt, dass python-prctl unter Linux sehr gut funktioniert. Sie müssen etwas anderes für Windows finden.

2
Vukasin Toroman