Er det en måte å endre effektiv prosess navn i Python?

stemmer
61

Kan jeg endre effektiv prosess navnet på et Python script? Jeg ønsker å vise et annet navn i stedet for den virkelige navnet på prosessen når jeg får system prosesslisten. I CI kan stille

strcpy(argv[0],othername);

Men i Python

argv[0] = othername

ser ikke ut til å fungere. Når jeg får prosesslisten (med ps axi min linux boks) det virkelige navnet endres ikke. Jeg foretrekker en bærbar løsning (eller annet man løsning for POSIX og en annen for Windows-miljøer), hvis den finnes.

Takk på forhånd

Publisert på 19/02/2009 klokken 10:37
kilden bruker
På andre språk...                            


8 svar

stemmer
-11
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

Merk singelen '=' tegn

Svarte 19/02/2009 kl. 10:39
kilden bruker

stemmer
4

Først, jeg er ikke sikker på at bare innstillinger argv[0]i et C-program portably endrer navnet som vises i ps. Kanskje det gjør i noen unixen, men min forståelse er at det ikke er forventet å.

For det andre, siden Windows er spesifikt ikke-POSIX-kompatibel, bare et par ting er "bærbar" mellom POSIX og ikke-POSIX. Siden du spesifikt sier 'ps', vil jeg anta at POSIX er din prioritet og Windows vil kanskje ikke fungere.

Enda viktigere, min forståelse av endring argv[0]er at det krever en oppfordring til execå gjøre disse endringene. Nærmere bestemt, exechar anropet både en bane til en kjørbar og en separat argvliste. Gjør din egen samtalen kan du bryte skallet konvensjonen av å sette den kjørbare navnet i argv[0].

Du har OS bibliotek prosessledelse som gir deg direkte tilgang til OS biblioteket for å gjøre dette. Du bør vurdere å bryte skriptet inn i to deler - en forrett og "virkelige arbeidet". Starteren etablerer den kjøretidsmiljø og kjørbart er den virkelige arbeid med de ønskede parametre.

I C, du erstatte din egen prosess med en annen. I Python, du erstatter den gamle Python tolk med en ny en som har en annen argv [0]. Forhåpentligvis vil det ikke vike tilbake for dette. Noen programmer sjekke argv [0] for å bestemme hva de gjør.

Du har også subprocess.popen som du kan bruke til å angi ønsket args og kjørbar. I dette tilfellet, derimot, bør den overordnede prosessen henger rundt for å hente barnet når barnet er ferdig. Den av foreldrene kan ikke gjøre noe mer enn enPopen.wait

Svarte 19/02/2009 kl. 11:31
kilden bruker

stemmer
10

Enkelt sagt, det er ingen bærbar måte. Du må teste systemet og bruke den foretrukne metoden for dette systemet.

Videre, jeg er forvirret om hva du mener med prosess navn på Windows.

Mener du et tjenestenavn? Jeg antar det, fordi ingenting annet som virkelig gjør noe fornuftig (minst til min ikke-Windows ved hjelp av hjernen).

I så fall må du bruke Tim Golden WMI grensesnitt og ringe .Change metoden på tjenesten ... i hvert fall ifølge hans opplæringen .

For Linux ingen av metodene jeg fant jobbet med unntak for dette dårlig pakket modul som setter argv [0] for deg.

Jeg vet ikke engang om dette vil fungere på BSD variantene (som har en setproctitle systemkall). Jeg er ganske sikker på argv [0] vil ikke fungere på Solaris.

Svarte 19/02/2009 kl. 12:26
kilden bruker

stemmer
46

faktisk du trenger 2 ting på linux: endre argv[0]fra C(for ps auxfog venner) og ringe prctlmed PR_SET_NAMEflagg.

Det er absolutt ingen måte å gjøre første stykke fra python selv. Selv om du kan bare endre prosessnavnet ved å ringe 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 auxfviser bare 'python' etter at :(. Men top, og ps -Avil vise nye 'testing ja' prosess navn :). Også killallog pkillvil jobbe med nytt navn.

forresten, procname fra googlecode også endres argv[0], således, selv forandrer ps auxfutgang.

OPPDATERING : Løsningen postet i dette svaret ikke spiller fint noen ganger på FreeBSD. Jeg bruker nå py-setproctitle nevnt i dette svaret for et år eller så på ulike Linux og FreeBSD bokser. Ingen klarer så langt! Alle bør også! :). Den bruker nesten den samme koden som PostgreSQL bruker i sine hoved database og barn prosesser.

Svarte 28/05/2009 kl. 20:39
kilden bruker

stemmer
69

Jeg har nylig skrevet en Python-modul for å endre prosessen tittelen i en bærbar måte: sjekk https://github.com/dvarrazzo/py-setproctitle

Det er en wrapper rundt koden som brukes av PostgreSQL å utføre tittelen endringen. Det er for tiden testet mot Linux og Mac OS X: Windows (med begrenset funksjonalitet) og BSD portings er på vei.

Edit: som i juli 2010, modulen fungerer med BSD og med begrenset funksjonalitet på Windows, og har blitt oversatt til Python 3.x.

Svarte 08/12/2009 kl. 12:40
kilden bruker

stemmer
6

Ta en titt på setproctitle pakke

Dette er ganske en bærbar versjon, og fungerer på mange plattformer.

Svarte 05/01/2010 kl. 14:28
kilden bruker

stemmer
0

Jeg har funnet python-prctl å fungere svært godt under Linux. Du er nødt til å finne noe annet for Windows.

Svarte 07/02/2011 kl. 15:45
kilden bruker

stemmer
3

Mitt svar på lignende spørsmål merket som duplikat :

Det er simplier (du trenger ikke importere noen libs), men kanskje ikke så elegant måte. Du må ikke bruke "env" inne i shebang linje.

Med andre ord, vil dette bli navngitt som "python" i prosessen listen:

#!/usr/bin/env python

Men dette vil bli navngitt med SCRIPT:

#!/usr/bin/python

Så vil du være i stand til å finne den med noe sånt pidof -x scriptnameellerps -C scriptname

Svarte 25/11/2015 kl. 09:12
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more