2009-02-19 12 views
58

Posso cambiare il nome effettivo del processo di uno script Python? Voglio mostrare un nome diverso invece del vero nome del processo quando ottengo l'elenco dei processi di sistema. In C posso impostareC'è un modo per cambiare il nome effettivo del processo in Python?

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

Ma in Python

argv[0] = "othername" 

non sembra funzionare. Quando ottengo la lista dei processi (con ps ax nella mia macchina Linux) il vero nome non cambia. Preferisco una soluzione portatile (oppure una soluzione per posix e un'altra per ambienti Windows), se esiste.

Grazie in anticipo

+0

vedere anche https://superuser.com/questions/427642/is-it-possibile-per-stare-ilprocesso-primo-con-pythonw, dove http: // bugs.python.org/issue5672 sono io Noto – anarcat

risposta

10

In poche parole, non c'è modo portatile. Dovrai testare il sistema e utilizzare il metodo preferito per quel sistema.

Inoltre, sono confuso su cosa intendi per nomi di processi su Windows.

Intendi un nome di servizio? Presumo di sì, perché nient'altro ha davvero senso (almeno per il mio non-Windows che usa il cervello).

Se è così, è necessario utilizzare Tim Golden's WMI interface e chiamare il metodo .Change sul servizio ... almeno secondo il suo tutorial.

Per Linux nessuno dei metodi che ho trovato funzionava tranne per this poorly packaged module che imposta argv [0] per te.

Non so nemmeno se questo funzionerà sulle varianti BSD (che ha una chiamata di sistema setproctitle). Sono abbastanza sicuro che argv [0] non funzionerà su Solaris.

+0

So che è tardi, ma per i nuovi lettori, considera anche @MattWritesCode [answer] (http://stackoverflow.com/a/13267122/248390), veloce e semplice per CPython su Linux. – bufh

-8
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 

Nota il singolo '=' firmo

+2

Ma se eseguo ps (elenco processi in finestre linux) il nome del processo rimane esattamente lo stesso. Prova a – Emilio

+1

quindi, invece di ridiscutere la mia risposta, prova a chiarire questo punto nella tua domanda. ... –

+2

Questo non modifica il nome del processo. Cambia solo la copia di Python di argv. Consiglierei di cancellare questa risposta ovviamente sbagliata. – Dakkaron

4

In primo luogo, non sono sicuro che le impostazioni semplicemente argv[0] in un programma C cambia portabile il nome mostrato in ps. Forse lo fa in alcuni unixen, ma la mia comprensione è che non è previsto.

In secondo luogo, poiché Windows è specificamente non conforme a POSIX, solo alcune cose sono "portatili" tra POSIX e non POSIX. Dal momento che dici in modo specifico "ps", presumo che POSIX sia la tua priorità e Windows potrebbe non funzionare.

Ancora più importante, la mia comprensione di cambiare argv[0] è che richiede una chiamata a exec per apportare queste modifiche. Nello specifico, la chiamata exec ha sia un percorso verso un eseguibile che un elenco separato argv. Effettuare la propria chiamata consente di rompere la convenzione della shell di inserire il nome dell'eseguibile in argv[0].

Hai OS library process management che ti consente di accedere direttamente alla libreria del sistema operativo. Dovresti considerare di suddividere il tuo copione in due parti: un antipasto e il "vero lavoro". L'antipasto stabilisce l'ambiente di runtime e exec è il vero lavoro con i parametri desiderati.

In C, stai sostituendo il tuo processo con un altro. In Python, stai sostituendo il vecchio interprete Python con uno nuovo con un argv diverso [0]. Spero che non si fermi su questo. Alcuni programmi controllano argv [0] per decidere cosa stanno facendo.

Hai anche subprocess.popen che puoi usare per impostare i tuoi argomenti ed eseguibili. In questo caso, tuttavia, il processo genitore dovrebbe indugiare per raccogliere il bambino quando il bambino finisce. Il genitore potrebbe non fare nulla di più di un Popen.wait

+1

No, cambiando argv in Linux (e probabilmente altri Unix, ma non tutti) cambia immediatamente il nome del processo visibile, che viene usato da molti programmi ampiamente usati per fornire nomi descrittivi per i loro processi: sia ssh che postgres fanno questo, e alcuni cambiano attivamente il loro nome al volo per indicare il loro stato attuale. Un modulo Python potrebbe essere scritto per fare ciò, usando la chiamata API Py_GetArgcArgv. –

45

in realtà avete bisogno di 2 cose su Linux: modificare argv[0] da C (per ps auxf e amici) e chiamare prctl con PR_SET_NAME bandiera.

Non c'è assolutamente alcun modo di fare il primo pezzo da Python stesso. Sebbene, puoi semplicemente cambiare il nome del processo chiamando 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 mostrerà solo 'python' dopo che :(. Ma top e ps -A mostrerà nuovo 'sì testare' il nome del processo :). Anche killall e pkill funzioneranno con il nuovo nome.

btw, procname da googlecode cambia anche argv[0], quindi, anche, cambia l'output ps auxf.

UPDATE: La soluzione pubblicata in questa risposta non funziona a volte su FreeBSD. Ora sto usando py-setproctitle dichiarato in this answer per un anno o giù di lì su varie finestre di Linux e FreeBSD. Non ci sono riusciti finora! Anche tutti dovrebbero! :). Utilizza quasi lo stesso codice di PostgreSQLuses nel suo database principale e nei processi figlio.

+0

procname non funziona su PyPy (solo su CPython) deve usare setproctitle. – radtek

67

Ho recentemente scritto un modulo Python per cambiare il titolo processo in modo portatile: controllare https://github.com/dvarrazzo/py-setproctitle

Si tratta di un wrapper per il codice utilizzato da PostgreSQL per eseguire il cambiamento di titolo. Attualmente è testato contro Linux e Mac OS X: Windows (con funzionalità limitate) e porting BSD sono in arrivo.

Modifica: a partire da luglio 2010, il modulo funziona con BSD e con funzionalità limitate su Windows ed è stato portato su Python 3.x.

+0

Impossibile installare su Windows. – user

+0

@user non importa: non è molto utile su Windows ma non c'è molto da fare a riguardo. – piro

+0

C'è un modo per cambiare gli argomenti visualizzati da ps -f? Non mi interessa davvero il nome del programma (sempre python), ma voglio cambiare gli argomenti visualizzati. – KillianDS

5

Dai un'occhiata a setproctitle pacchetto

Questo è un bel versione portatile e funziona su molte piattaforme.

0

Ho trovato python-prctl funzionare molto bene sotto Linux. Dovrai trovare qualcos'altro per Windows.

2

La mia risposta alla domanda simile contrassegnato come duplicate:

C'è più semplice (non è necessario importare qualsiasi librerie), ma così forse non così elegante. Non devi usare "env" all'interno della linea shebang.

In altre parole, questo sarà nominato come "pitone" in lista dei processi:

#!/usr/bin/env python 

Ma questo si chiamerà con il nomescript:

#!/usr/bin/python 

così sarete in grado di trovarlo con qualcosa come pidof -x scriptname o ps -C scriptname

Problemi correlati